目录
- 一、题目
- 二、思路
- 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–就行了,链表的反向遍历用递归,就是每次都会从尾部向前就行操作。