请教递归实现不反转链表却打印链表逆序的原理
链表逆序打印的递归代码逻辑解析
这段代码的核心是利用递归调用栈的特性实现逆序打印,完全不需要修改链表结构,下面一步步拆解逻辑:
代码核心逻辑拆解
void printReverse(Node head) { if (head == null) return; // 递归终止条件:遇到空节点就返回 printReverse(head.next); // 先递归处理当前节点的下一个节点 System.out.print(head.data+" "); // 等后续节点处理完,再打印当前节点的数据 }
用具体链表实例走一遍执行流程
假设链表结构是:1 -> 2 -> 3 -> null,执行printReverse(1)的过程如下:
- 调用
printReverse(1):head不为空,先执行printReverse(2) - 调用
printReverse(2):head不为空,先执行printReverse(3) - 调用
printReverse(3):head不为空,先执行printReverse(null) - 调用
printReverse(null):触发终止条件,直接返回 - 回到
printReverse(3)的执行上下文,执行打印:输出3 - 回到
printReverse(2)的执行上下文,执行打印:输出2 - 回到
printReverse(1)的执行上下文,执行打印:输出1
最终输出结果就是:3 2 1
为什么会“反向执行”?
递归调用的时候,每一次printReverse(head.next)都会把当前函数的执行暂停,先去处理下一个节点的调用——这些未完成的函数调用会被存在调用栈里。直到遇到空节点(终止条件),调用栈开始从最后一个压入的函数(也就是处理最后一个节点的printReverse(3))开始依次返回,每返回一个函数就执行它的打印语句,自然就实现了从链表尾部到头部的逆序输出。
内容的提问来源于stack exchange,提问作者FNZ
相关产品推荐
相关产品推荐

