You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java链表实现的Stack的push函数无法更新节点数据问题

问题根因

你的代码存在两处逻辑冗余错误,最终导致首次入栈的节点自引用,遍历栈时会陷入死循环永远读取第一个节点的值,看起来就像所有节点都只保存了第一个元素:

  • 你调用Node<T> newNode = new Node<T>(element, top)的时候,已经完成了新节点数据赋值、前驱节点关联的操作,后续多余的newNode.setData(element)、newNode.setLink(top)属于完全冗余的操作
  • 首次入栈触发isEmpty()判断时,你先把top赋值为当前新节点,再执行newNode.setLink(top),直接让第一个节点的后继指针指向了自己,后续遍历栈的时候会永远循环读取第一个节点的数值

修复后的代码

public void push(T element) {
    // 直接创建新节点,关联当前栈顶作为前驱
    Node<T> newNode = new Node<T>(element, top);
    // 空栈特殊处理:栈底也指向新节点
    if(isEmpty()) {
        bottom = newNode;
        System.out.println("Stack is empty");
    }
    // 更新栈顶为新节点,计数+1
    top = newNode;
    count++;
    return;
}

逻辑说明

  1. 构造新节点时已经完成数据、前驱关联,不需要重复调用set方法修改节点属性
  2. 空栈场景只需要额外处理bottom指针即可,不需要修改top的赋值逻辑,避免首次入栈时节点自引用
  3. 所有入栈场景最终统一把栈顶更新为新节点,逻辑完全统一不会出现异常

内容的提问来源于stack exchange,提问作者Rory

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:39:05