You need to enable JavaScript to run this app. 基于指定自定义LinkedList类实现reverse方法为何输出结果异常
优惠活动
大模型
产品
解决方案
定价
更多

基于指定自定义LinkedList类实现reverse方法为何输出结果异常

反转结果异常的核心原因

问题出在while循环的边界条件错误:

  • 原代码的循环判断条件为tmp != null && tmp.next != null,当遍历指针tmp走到原链表的最后一个节点(即值为1的尾节点)时,因为该节点的next为null,会直接退出循环,完全跳过对这个尾节点的指针操作
  • 逐帧跟踪输入链表4→3→2→1→null的执行过程:
    1. 初始化:tmp指向头节点4,prev为null
    2. 第1轮循环:处理节点4,将其next指向prev,随后prev移动到节点4,tmp移动到节点3
    3. 第2轮循环:处理节点3,将其next指向prev,随后prev移动到节点3,tmp移动到节点2
    4. 第3轮循环:处理节点2,将其next指向prev,随后prev移动到节点2,tmp移动到节点1
    5. 此时判断循环条件: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 16:54:04