206. 反转链表

思路:
虽然说简单题,但如果无法秒杀还是说明基础不好。那我还是太笨了,绕来绕去才找到的了正确方法。
就用一个cur,一个pre,一开始cur指向nullptr,pre指向head,然后进入循环,循环条件就是pre不为nullptr。然后我们需要建立一个临时变量temp存放pre->next。因为我们的做法是这样的,让pre->next指向cur,然后丢失了原本的pre->next,然后cur=pre,pre=temp。举个例子1->2->3->4->nullptr,第一次循环就是nullptr<-1<-2,3->4->nullptr,此时cur=2,pre=3,因此虽然2,3断开但pre还是能链接到2。
代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* cur= nullptr;
        ListNode* pre = head;
        while(pre!=nullptr){
            ListNode* temp = pre->next;
            pre->next = cur;
            cur = pre;
            pre = temp;
        }
        return head;
    }
};

递归:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {

public:
    ListNode* reverseList(ListNode* head) {
        if(head==nullptr||head->next==nullptr) return head;
        ListNode* cur = reverseList(head->next);
        head->next->next = head;
        head->next = nullptr;
        return cur;
    }
};

该方法就是直接找到反转后的head,然后将从后往前反转。1->2->3->4->nullptr, 1->2<-3<-4->nullptr,然后cur一直指向4,通过head->next->next=head来翻转

双指针:
通过head->next不断向后移动,和临时变量temp用来和cur用来反转。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {

public:
    ListNode* reverseList(ListNode* head) {
        if(head==nullptr) return nullptr;
        ListNode* cur=head;
        while(head->next!=nullptr){
            ListNode* temp = head->next;
            head->next=head->next->next;
            temp->next=cur;
            cur = temp;
        }

        return cur;
    }
};

1->2->3->4->nullptr,一开始head和cur都指向1,然后开始循环,head->next从指向2变为指向3,在这之前我们要temp用来保存2,然后temp->next=cur,将2指向1,cur=temp,所以此时是2->1->3->4->nullptr,继续head->next指向4,temp指向3,cur指向2,然后temp->next=cur,将3指向2,cur=temp,此时3->2->1->4->nullptr。当循环结束即反转成功

上一篇:Solution Set -「ARC 124」


下一篇:剑指Offer - 面试题8:二叉树的下一个节点