反转链表.
方法一:双指针法
class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode*temp;ListNode*cur=head;ListNode*pre=NULL;while(cur){temp=cur->next;cur->next=pre;pre=cur;cur=temp;}return pre;}
};
创立一个指针temp用来存储链表。创立一个指针cur指向头节点head。创立一个指针pre指向指针为空NULL。当cur不为空时进入循环,创建一个ListNode类型的指针tmp,用于暂存cur结点的下一个节点。将cur指向下一个节点的指针指向pre(链表指针反转),将pre向后移,即pre=cur,将cur向后移,即cur=temp;跳出循环,返回pre(用为此时pre位于最后一个节点)
方法二:递归法
1.从前往后递归。
reverse是反转函数
class Solution {
public:ListNode* reverseList(ListNode* head) {return reverse(NULL, head);}ListNode* reverse(ListNode* pre, ListNode* cur) {if (cur == NULL)return pre; ListNode* temp = cur->next;cur->next = pre;return reverse(cur, temp);}
};
定义一个主函数,调用子函数。定义一个子函数,如果cur节点为空,则返回pre。创立一个指针temp用来储存链表。将cur指向下一个节点的指针指向pre(链表指针反转),返回reverse函数。
2.从后往前递归
class Solution {
public:ListNode* reverseList(ListNode* head) {if(head==NULL) return NULL;if(head->next==NULL)return head;ListNode*last=reverseList(head->next);head->next->next=head;head->next=NULL;return last;}
};
先判断边缘条件,如果头指针head为空null则返回空链表,如果头指针head指向的下一个节点head->next为空null,则返回头指针head。用reverseList翻转第二个节点开始的指针,last指向翻转后的链表节点。头结点指向的下一个节点的指针head->next->next指向头节点head。头节点指向的下一个节点的指针head->next指向空节点null。最后返回last。
方法三:使用虚拟头节点反转链表
class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* dummyhead=new ListNode(0);dummyhead->next=NULL;ListNode*cur=head;while(cur!=NULL){ListNode* tmp=cur->next;cur->next=dummyhead->next;dummyhead->next=cur;cur=tmp;} head=dummyhead->next;return head;}
};
创建一个ListNode类型的虚拟头节点dummyhead,值为0。dummyhead指针的指向为空NULL。创建一个ListNode类型的指针cur,并将其初始化传入head。如果指针cur的指向不为空NULL,则进入循环,创建一个ListNode类型的指针tmp,用于暂存cur结点的下一个节点。将当前节点cur指针指向的下一个结点指向dummyhead指针指向的象一个节点。将dummyhead指向下一个节点的指针指向cur。将cur后移,即cur=tmp。跳出循环。用头插法将遍历后的链表插入到虚拟头节点指向的下一个节点。返回反转后的链表头指针。