递归反转栈

Median of Two Sorted Arrays 两个有序数组的中位数leetcode
https://www.cnblogs.com/grandyang/p/4465932.html
[LeetCode] Invert Binary Tree 翻转二叉树
https://www.cnblogs.com/grandyang/p/4572877.html
leetcode移除有序链表中的重复项之二
https://www.cnblogs.com/grandyang/p/4069003.html
递归反转栈
https://www.cnblogs.com/4everlove/p/3666016.html

BIGO-机器学习算法工程师
https://www.nowcoder.com/discuss/255042?type=2&order=0&pos=16&page=1
https://www.nowcoder.com/discuss/239639?type=2&order=0&pos=54&page=1
https://www.nowcoder.com/discuss/238325?type=2&order=0&pos=70&page=1
https://www.nowcoder.com/discuss/238019?type=2&order=0&pos=69&page=1
https://www.nowcoder.com/discuss/242777?type=2&order=0&pos=53&page=1
https://www.nowcoder.com/discuss/243474?type=2&order=0&pos=50&page=1
https://www.nowcoder.com/discuss/243829?type=2&order=0&pos=44&page=1
https://www.nowcoder.com/discuss/243488?type=2&order=0&pos=39&page=1
https://www.nowcoder.com/discuss/238781?type=2&order=0&pos=34&page=1
https://www.nowcoder.com/discuss/252968?type=2&order=0&pos=24&page=1
https://www.nowcoder.com/discuss/246825?type=2&order=0&pos=10&page=1
https://www.nowcoder.com/discuss/260893?type=2&order=0&pos=2&page=1

<think> 我们要求动态演示递归反转单链表,但作为文本模型,无法直接生成动画或视频。因此,我将用详细的步骤分解和图示(使用文本描述)来解释递归反转单链表的过程。同时,我会提供伪代码和递归每一步的状态,以便理解。 递归反转单链表的基本思想(参考引用[2][4]): 1. 递归终止条件:如果链表为空或只有一个节点,则直接返回头节点(因为反转后还是自身)。 2. 递归步骤:先反转以头节点下一个节点开始的子链表,然后将当前头节点接在反转后的子链表的末尾,同时将头节点的next置为null。 递归函数定义(C语言风格): ```c ListNode* reverseList(ListNode* head) { // 终止条件 if (head == NULL || head->next == NULL) { return head; } // 递归反转子链表(从head->next开始) ListNode* p = reverseList(head->next); // 将当前节点head接在反转后的子链表的末尾 head->next->next = head; head->next = NULL; return p; } ``` 现在,我们用一个小例子(链表1->2->3->4)来动态演示递归过程: 初始链表:1 → 2 → 3 → 4 → NULL 递归调用(从最深层开始返回时执行连接操作): 步骤1:递归到底(head->next为NULL)开始返回 - 最后一次调用:head=4,满足终止条件,返回4。此时p=4,然后返回给上一层(head=3的那层)。 步骤2:head=3的递归层 - 执行p = reverseList(head->next) 得到p指向4(此时子链表已经反转,即4->3后面的部分已经反转好,但还没有调整3和4的指针) - 执行:head->next->next = head; 即3的下一个节点(4)的next指向3,也就是4->3 - 执行:head->next = NULL; 即3的next置空,此时4->3->NULL - 返回p(即4)给上一层(head=2) 步骤3:head=2的递归层 - 得到p=4(实际上此时反转后的子链表是4->3,头节点是4) - 执行:head->next->next = head; 即2的下一个节点(3)的next指向2,也就是3->2 - 执行:head->next = NULL; 即2的next置空,此时链表变为4->3->2->NULL - 返回p(4)给上一层(head=1) 步骤4:head=1的递归层 - 得到p=4(此时反转后的子链表是4->3->2) - 执行:head->next->next = head; 即1的下一个节点(2)的next指向1,也就是2->1 - 执行:head->next = NULL; 即1的next置空,此时链表变为4->3->2->1->NULL - 返回p(4)作为整个反转后链表的头节点 最终反转结果:4 → 3 → 2 → 1 → NULL 为了更直观,我们用每一步的链表状态来表示: 递归调用过程(从调用到返回): 1. reverseList(1) 调用 reverseList(2) 2. reverseList(2) 调用 reverseList(3) 3. reverseList(3) 调用 reverseList(4) 4. reverseList(4) 返回 4 返回过程: - 从reverseList(4)返回到reverseList(3): 在reverseList(3)中: head=3, head->next=4 p = reverseList(4)返回的4 执行:4->next = 3 (即head->next->next=head) -> 链表变为:4→3(注意,此时3的next还是4,但紧接着执行head->next=NULL,所以3的next变为NULL) 链表状态:4→3→NULL 返回p=4 - 返回到reverseList(2): head=2, head->next=3(注意,此时整个链表其实还是1->2->3->...,但在递归返回过程中,我们修改了部分指针) p=4(指向反转后子链表的头节点4) 执行:head->next->next=head 即 3->next=2 -> 链表变为:4→3→2,同时2->next原本指向3,现在执行head->next=NULL,所以2->next=NULL。 链表状态:4→3→2→NULL 返回p=4 - 返回到reverseList(1): head=1, head->next=2 p=4 执行:head->next->next=head 即2->next=1 -> 链表变为:4→3→2→1,然后1->next=NULL。 最终链表:4→3→2→1→NULL 返回p=4 由于我们无法展示动态图,建议读者在纸上画图理解每一步指针的变化。 另外,引用[5]提到了递归方法中需要注意避免形成环,所以在递归过程中及时将当前节点的next置空非常重要。 §§相关问题§§ 1. 递归反转链表的时间复杂度和空间复杂度是多少? 2. 递归反转链表的最大深度受什么限制? 3. 除了递归,还有哪些方法可以反转单链表? 4. 递归反转链表在什么情况下会溢出? </think> ### 递归反转单链表的动态演示(文字解释) 由于无法直接生成动画,我将通过**分步图解+代码模拟**的方式展示递归反转单链表的全过程。以链表 `1 → 2 → 3 → 4 → NULL` 为例: #### 📌 初始状态 ```mermaid graph LR A[1] --> B[2] --> C[3] --> D[4] --> E[NULL] ``` #### 🔁 递归步骤分解(参考引用[2][4][5]) 1. **递归到底层(终止条件)** - 当递归到 `head=4` 时满足终止条件(`head->next == NULL`),返回头节点 `4`: ```mermaid graph LR D[4] --> E[NULL] ``` ▶️ 返回 `p = 4` 2. **回溯到 `head=3` 的递归层** - 执行 `head->next->next = head` `4->next = 3` → 建立反向链接 - 执行 `head->next = NULL` `3->next = NULL` → 断开原链接 ```mermaid graph LR D[4] --> C[3] --> E[NULL] ``` ▶️ 返回 `p = 4`(新头节点) 3. **回溯到 `head=2` 的递归层** - `3->next = 2`(反向链接) - `2->next = NULL`(断开原链接) ```mermaid graph LR D[4] --> C[3] --> B[2] --> E[NULL] ``` ▶️ 返回 `p = 4` 4. **回溯到 `head=1` 的递归层** - `2->next = 1`(反向链接) - `1->next = NULL`(断开原链接) ```mermaid graph LR D[4] --> C[3] --> B[2] --> A[1] --> E[NULL] ``` ▶️ 返回最终头节点 `p = 4` #### 💻 递归代码模拟(C语言实现) ```c struct ListNode* reverseList(struct ListNode* head) { // 终止条件:空链表或单个节点 if (head == NULL || head->next == NULL) return head; // [^4] // 递归反转子链表(关键步骤) struct ListNode* p = reverseList(head->next); // 反转当前节点指针方向 head->next->next = head; // 后驱节点指回当前节点 [^5] head->next = NULL; // 断开原正向链接 return p; // 始终返回新链表的头节点 } ``` #### 🔑 动态过程关键点 1. **递归的推进方向** ```mermaid graph LR F[reverseList1] --> G[reverseList2] --> H[reverseList3] --> I[reverseList4] ``` 2. **指针反转的微观操作** - `head->next->next = head`: ```mermaid graph LR X[当前节点] --> Y[后驱节点] Y --> X ``` - `head->next = NULL`: ```mermaid graph LR X[当前节点] -->|断开| NULL ``` #### ️ 注意事项 1. 递归深度 = 链表长度,长链表可能导致**溢出**(引用[2]) 2. 每次递归仅处理**两个节点**的指针反转(当前节点和后驱节点) 3. 终止条件是递归正确性的关键(引用[4]) 如果需要可视化演示,推荐访问: - [Visualgo 链表反转动画](https://visualgo.net/zh/list) - [USFCA 递归可视化工具](https://www.cs.usfca.edu/~galles/visualization/Recursion.html)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值