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; }
逻辑说明
- 构造新节点时已经完成数据、前驱关联,不需要重复调用set方法修改节点属性
- 空栈场景只需要额外处理
bottom指针即可,不需要修改top的赋值逻辑,避免首次入栈时节点自引用 - 所有入栈场景最终统一把栈顶更新为新节点,逻辑完全统一不会出现异常
内容的提问来源于stack exchange,提问作者Rory
相关产品推荐
相关产品推荐

