206. 反转链表
程序员文章站
2022-03-07 21:37:31
描述反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?思路1:迭代法设置一个临时结点指针tmp,用于保存当前结点改变指向后断开后的列表首元素,一前一后双指针,从头到尾移动。此方法简单。解答1/** * Definition for singly-linked list. * struct...
描述
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
思路1:双指针法(迭代)
设置一个临时结点指针tmp,用于保存当前结点改变指向后断开后的列表首元素,一前一后双指针,从头到尾移动。此方法简单。
解答1
/**
* 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 == NULL || head->next == NULL) return head;
ListNode* tmp;
ListNode* pre = NULL;
ListNode* curr = head;//current代替head
while(curr){
tmp = tmp->next; //保存下一个节点
curr->next = pre;
pre = curr;
curr = tmp;
}
return pre;
}
};
思路2:递归法
不得不说,这个方法太难理解了,只看代码绞尽脑汁我都想不出来过程…
推荐去LeetCode题解看此人的ppt,有递归的详细过程。
这里要注意两点:
(1)假设链表[1,2,3,4,5],最终触发第一行返回代码时,reverseList()函数
返回的head是5,赋值给curr,后面每次返回的curr都是head=5这个结点。
(2)head->next->next
这句,因为第5层(共5层)函数返回后,当前在第4层函数,当前head是4,所以head->next->next
即5->next
;head->next
置空防止链表更改指向后出现循环。
解答2
/**
* 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 == NULL || head->next == NULL) return head;
ListNode* curr = reverseList(head->next);//curr保存终结点
head->next->next = head;
head->next = NULL;
return curr;
}
};
本文地址:https://blog.csdn.net/mbytes/article/details/109237567