第一种:记录前驱,从第一个节点开始
1.用一个指针记录其next的位置(防止在其指向前面节点无法指向后面的节点的位置) q=p->next
2.记录了后面的位置,那我们可以大胆的将p->next指向前驱节点pre p->next=pre
3.前驱节点变为当前节点 pre=p;
4.当前节点可以达到后面节点的位置,也就是预存的q的位置 p=q;(所以q的作用只是存放后继节点的位置)
5.重复1-4的操作直到后继节点位置为NULL
到最后的时候,会有点特殊。
后继节点的next和p->next都是NULL,退出了循环,而pre是倒数第二节点。最后节点并没有指向pre,所以需要p->next=pre;或者q->next=pre; return q;
/**
* 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) {
ListNode *p=head;
ListNode *q=NULL;
ListNode *pre=NULL;
if(p==NULL||p->next==NULL)
return p;
while(p->next!=NULL)
{
q=p->next;
p->next=pre;
pre=p;
p=q;
}
p->next=pre;
return p;
}
};
2.使用头插法,新建一个节点,每次重头部插入(代码好像一样。。)
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *p=head;
ListNode *q=head;
ListNode *tail=NULL;
if(head==NULL||head->next==NULL)
return q;
while(p->next!=NULL)
{
q=p->next;
p->next=tail;
tail=p;
p=q;
}
p->next=tail;
tail=p;
return tail;
}
};
3.使用栈 stack 先进后出 达到逆序。