递归链表反转算法基准返回值解析及代码逻辑疑问咨询
递归反转链表:拆解你困惑的最后几行逻辑
我来一步步给你捋清楚这个递归过程,帮你搞懂smallans的变化和最后四行的作用~
先明确我们要反转的链表是:1 → 2 → 3 → NULL
第一步:递归触达基准情况
当递归调用到reverse_linked_list_rec(3)时,head->next == NULL(因为3的下一个是NULL),所以直接返回head也就是节点3。这个返回值会作为上一层调用的smallans。
第二步:回到head=2的调用层
此时:
smallans= 刚才返回的节点3(不是你以为的2哦!smallans永远是反转后的链表的头节点,也就是原链表的尾节点)tail = head->next→ 也就是节点3tail->next = head→ 把节点3的next指向节点2,现在链表变成3 → 2head->next = NULL→ 把节点2的next设为NULL,避免循环,现在链表是3 → 2 → NULL- 最后返回
smallans(节点3),这个值会传到上一层head=1的调用里。
第三步:回到head=1的调用层
此时:
smallans= 节点3tail = head->next→ 节点2tail->next = head→ 节点2的next指向节点1,链表变成3 → 2 → 1head->next = NULL→ 节点1的next设为NULL,最终链表是3 → 2 → 1 → NULL- 返回
smallans(节点3),这就是反转后的链表的头节点。
为什么要返回smallans?
因为smallans从递归的最底层(原链表的尾节点)开始,每一层递归都把它传递回去——它始终是反转后链表的头节点。如果不返回它,上层调用就拿不到反转后的链表的入口啦。
内容的提问来源于stack exchange,提问作者Shivam Mishra
相关产品推荐
相关产品推荐

