反转链表(两种实现)

反转链表

反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

方法一-前插法:
这道题目我们可以先创建一个新的表头,然后按正序每抓取到一个原链表的节点,就前插到这个新的链表里,最后我们就可以得到一个恰好为原链表反序的新链表:

struct ListNode* reverseList(struct ListNode* head) 
{
    struct ListNode* new = NULL;
    while(head!=NULL)
    {
        struct ListNode* temp = head;
        head = head->next;
        temp->next = new;
        new = temp;
    }
    return new;
}

方法二-三指针法
这里还有一种实现思路:当每次到达一个节点时,便修改节点使它指向前一个节点,这样我们就在原位置实现了链表反转,因为题目是单向链表,所以我们需要设定一个Prev来储存前一个节点的位置,再用一个next变量存放下一个节点,使用go变量来遍历链表,这就是三指针法;

struct ListNode* reverseList(struct ListNode* head) //在得到节点时原位置直接改变
{
    if(head==NULL)
    {return head;}
    struct ListNode* prev = NULL;
    struct ListNode* next = head->next;
    for(struct ListNode* go = head;go!=NULL;)
    {
        go->next=prev;
        prev =go;
        go = next;
        if(next!=NULL)
        {next = next->next;}
    }
    return prev;
}

你可能感兴趣的:(LC,算法训练)