206. 反转链表
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
递归就是对双指针的方法进行改写 是一个思想
- 说是双指针 其实是三指针 第三个指针保存着断了连接的后序链表首地址
- cur指针指向当前需要掉换方向的结点 pre指针指向cur即将指向的那个前结点
- pre初始化为NULL,cur初始化为head,tmp保存为cur->next
- cur->next=pre,pre=cur,cur=tmp;
- 直到cur为空
- ==最后返回的是pre ==
class Solution2 {
//双指针
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre=NULL;
ListNode* cur=head;
while(cur!=NULL){
ListNode* tmp=cur->next;
cur->next=pre;
pre=cur;
cur=tmp;
}
return pre;//最后一步指针cur指向NULL,pre指向最后一个结点
}
};
class Solution {
//递归
public:
ListNode* reverse(ListNode* cur,ListNode* pre){
if(cur==NULL)
return pre;
ListNode* tmp=cur->next;
cur->next=pre;
//pre=cur;
//cur=tmp;
return reverse(tmp,cur);;
}
ListNode* reverseList(ListNode* head) {
ListNode* cur=head;
ListNode* pre=NULL;
return reverse(head,pre);
}
};