206. 反转链表
目录
- 一、题目
- 二、思路
- 2.1 解题思路
- 2.2 代码尝试
- 2.3 疑难问题
- 2.4 AI复盘
- 三、解法
- 四、收获
- 4.1 心得
- 4.2 举一反三
一、题目
二、思路
2.1 解题思路
需要有头尾指针,然后又觉得可以用递归
2.2 代码尝试
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* p=head;
//尾指针
ListNode* tail=new ListNode(0);
//把每一个节点拆下来之后,依次从前接上
//首节点跟null,其他依次连接首节点
while(head){
p=head;
p->next=tail;
tail=p;
head=head->next;
}
return p;
}
};
2.3 疑难问题
2.4 AI复盘
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr; // 用于存储前一个节点
ListNode* curr = head; // 当前节点
while (curr != nullptr) {
ListNode* nextTemp = curr->next; // 保存下一个节点
curr->next = prev; // 反转当前节点的指针
prev = curr; // 移动prev到当前节点
curr = nextTemp; // 移动curr到下一个节点
}
return prev; // prev最终指向反转后的头节点
}
};
正确更新指针:在反转链表时,你需要先保存当前节点的下一个节点(nextTemp),然后将当前节点的 next 指针指向前一个节点(prev),最后更新 prev 和 curr 指针。
三、解法
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (!head || !head->next) {
return head;
}
ListNode* newHead = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return newHead;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/reverse-linked-list/solutions/551596/fan-zhuan-lian-biao-by-leetcode-solution-d1k2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
四、收获
4.1 心得
不仅要存储先前的节点,还要存储后面的节点。
递归的精髓就是,它能够做到反向遍历,因为在顺序表中,反向遍历很简单,只有i–就行了,链表的反向遍历用递归,就是每次都会从尾部向前就行操作。