示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(!head)return NULL;
if(!head->next)return head;
ListNode* q=head;
ListNode* p=q->next;
q->next=NULL;
while(p){
ListNode* tmp=p->next;
p->next=q;
q=p;
p=tmp;
}
head=q;
return head;
}
};
初始为进循环之前
进入第一次循环后,我们先要保留一个暂存指向q的后继的结点,然后将我们初始的P指向头结点q形成了第一次倒转指向,之后我们因为要继续前进修改指向,所以将初始的q位置变到p,而p结点则到了之前暂存的tmp结点位置
继续循环进行如下图所示 其实就是层层推进加下变向
最后直到P变成NULL退出循环,此时正好q指向末尾,将其还给头结点head就完成了