思路:
虽然说简单题,但如果无法秒杀还是说明基础不好。那我还是太笨了,绕来绕去才找到的了正确方法。
就用一个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。当循环结束即反转成功