基于指定自定义LinkedList类实现reverse方法为何输出结果异常
反转结果异常的核心原因
问题出在while循环的边界条件错误:
- 原代码的循环判断条件为
tmp != null && tmp.next != null,当遍历指针tmp走到原链表的最后一个节点(即值为1的尾节点)时,因为该节点的next为null,会直接退出循环,完全跳过对这个尾节点的指针操作 - 逐帧跟踪输入链表
4→3→2→1→null的执行过程:- 初始化:
tmp指向头节点4,prev为null - 第1轮循环:处理节点4,将其next指向prev,随后
prev移动到节点4,tmp移动到节点3 - 第2轮循环:处理节点3,将其next指向prev,随后
prev移动到节点3,tmp移动到节点2 - 第3轮循环:处理节点2,将其next指向prev,随后
prev移动到节点2,tmp移动到节点1 - 此时判断循环条件:
tmp指向节点1非空,但tmp.next为null,不满足循环要求,直接退出循环
- 初始化:
- 退出循环后执行
head = prev,此时prev指向节点2,已完成反向连接的链表结构为2→3→4→null;原本的尾节点1因为没有被纳入处理流程,游离在整个链表结构之外,从head开始遍历输出就只会得到2 3 4,和观察到的现象完全吻合。
修正方案
删除循环条件中多余的tmp.next != null判断,只要遍历指针没有走到原链表的末尾null,就持续执行节点指针的反转操作即可,修正后的代码如下:
public void reverse() { Node tmp = head; Node prev = null; Node nextNode = null; while(tmp != null) { nextNode = tmp.next; tmp.next = prev; prev = tmp; tmp = nextNode; } head = prev; }
修正后,循环会持续执行直到
tmp走到原链表末尾的null位置才退出,此时prev会停在原链表的最后一个节点(值为1的节点),将该节点赋值为新的head后,链表结构就是正确的1→2→3→4→null。
内容的提问来源于stack exchange,提问作者h4ckerlinguist
相关产品推荐
相关产品推荐

