Java链表实现队列:尾部插入元素后列表仍为空问题求助
问题排查与解决方案
1. 先查isEmpty()方法的实现
如果这个方法逻辑写错,会直接导致节点添加的分支走歪。比如要是写成return head != null;,永远返回false,初始状态下tail是null,调用tail.setNext()会抛空指针,但你说没异常,那大概率是另一种错误——比如判断的是size == 0但size变量压根没更新。正确的实现应该是:
public boolean isEmpty() { return head == null; }
2. 确认head和tail是类成员变量
要是这俩变量是addNodeLastInQueue方法里的局部变量,每次调用方法都会重新赋值,方法结束后变量直接销毁,队列自然存不住节点。必须把它们声明在队列类的成员位置:
public class MyQueue<E> { private MyNode<E> head; private MyNode<E> tail; // 其他代码... }
3. 检查MyNode的setNext方法
如果这个方法没正确给节点的next属性赋值,新节点永远链不进队列。MyNode的正确实现得是这样:
public class MyNode<E> { private E element; private MyNode<E> next; public MyNode(E element) { this.element = element; this.next = null; } public void setNext(MyNode<E> next) { this.next = next; // 这里必须正确赋值,不能写错变量 } // 可选:加getNext和getElement方法,方便遍历验证 public MyNode<E> getNext() { return next; } public E getElement() { return element; } }
4. 有size变量的话必须同步更新
如果你的队列类维护了size成员,每次添加节点后必须把size++,不然后续用size判断队列是否为空时,会出现“明明加了元素却显示空”的错觉:
public void addNodeLastInQueue(E element){ MyNode<E> nodeToBeAdded = new MyNode<E>(element); if(isEmpty()){ head = nodeToBeAdded; tail = nodeToBeAdded; }else{ tail.setNext(nodeToBeAdded); tail = nodeToBeAdded; } size++; // 有size变量就必须加这行 }
验证方法
加完元素后,写个遍历打印的方法确认节点是否真的被链入:
public void printQueue() { MyNode<E> current = head; while (current != null) { System.out.println(current.getElement()); current = current.getNext(); } }
调用这个方法就能直观看到队列里到底有没有元素。
内容的提问来源于stack exchange,提问作者Dorra
相关产品推荐
相关产品推荐

