递归反转单链表疑惑:为何reverse.next不生效而head.next.next可行?
递归反转单链表的困惑解答
你搞混了reverse变量的实际含义——它从始至终都是反转后链表的头节点(也就是原链表的最后一个节点),不是当前head.next反转后的尾节点,这就是为什么reverse.next = head会出错,而head.next.next = head能正常工作的核心原因。
具体拆解递归过程(拿链表 1->2->3->null 举例)
递归终止阶段:
当递归到head=3时,因为head.next=null,直接返回3,这个3就是反转后的头节点,后续所有上层递归的reverse都会等于这个3。为什么
reverse.next = head不行?- 回到
head=2的层级,reverse=3,如果执行reverse.next=2,此时链表是3->2,看起来没问题; - 但再回到
head=1的层级,reverse还是3,执行reverse.next=1就会把3的next改成1,之前的2直接被覆盖,最终链表变成3->1,丢失了中间节点2,彻底错误。
- 回到
为什么
head.next.next = head能正常工作?- 回到
head=2的层级,head.next是3,head.next.next=head就是把3的next指向2,此时链表变成2<->3; - 接着执行
head.next=null,断开2指向3的旧连接,链表变成3->2,返回3; - 回到
head=1的层级,head.next是2,head.next.next=head把2的next指向1,链表变成3->2->1; - 再执行
head.next=null,断开1指向2的旧连接,最终得到正确的反转链表3->2->1。
- 回到
核心逻辑总结
递归的每一步只需要处理当前节点和它的直接后继节点的反转关系:让后继节点指向自己,再把自己的next置空(防止出现循环链表)。而reverse作为反转后的头节点,它的后续连接已经在下层递归中逐步构建完成,根本不需要修改它的next属性。
内容的提问来源于stack exchange,提问作者dslash
相关产品推荐
相关产品推荐

