1.大体思路就是:让链表的第一个节点(除去头节点)先指向null,这样就断开了和第二个节点的连接,然后让第二个节点指向第一个节点....以此类推,直到最后一个节点指向倒数第二个节点,重新赋一个头节点;
2确定一个主移动的指针curr保证反转的进行,一开始他指向第一个节点(相当与头节点).他的任务就是推进节点移动(curr=curr->next);
3.其中,我们用一个prev指针来切断和前一个节点的连接,所以他一开始指向null,每次更新完curr之后,curr->next=prev,让他给箭头掉头,然后一次反转就结束了,然后再把让curr变成下一轮的prev,prev=curr;
4.注意!,为保证每次curr能顺利移动,需要反转之前用一个next先存储下一轮的主节点(curr->next=next),然后在反转结束后我们就可以移动curr了!(curr=next)
总结一下特点,每一轮的反转我们最后都让prev前进了&& 让curr和next指向了下一轮的主节点,所以最后为了反转最后一个节点,我们做完curr->next=prev后我们又更新了prev和next和curr,所以最后prev为最后一个原链表中的有效节点,而curr和next都指向了null!所以最后一步就是head=prev
代码如下:
/**
* 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) {
struct ListNode*curr,*prev,*next;
curr=head;
prev=nullptr;
while(curr!=nullptr){
next=curr->next;
curr->next=prev;
prev=curr;
curr=next;
}
return prev;
}
};