Java链式队列(Linked Queue)入队异常问题排查求助
LinkedQueue入队方法异常问题解决方案
我实现了QueueInterface接口的LinkedQueue.java类,执行enqueue(入队)操作时出现异常:第一个入队值被“忽略”,第二个入队操作实际入队第一个值,第三个入队操作入队第二个值,第四个入队操作入队第三个值,最终第四个值从未被入队。
测试代码
public class QueueTest3 { public static void main(String[] args) { QueueInterface<Integer> queue = new LinkedQueue<Integer>(); //use enqueue method System.out.println("\nenqueuing -1"); queue.enqueue(-1); queue.display(); System.out.println("\nenqueuing 0"); queue.enqueue(0); queue.display(); System.out.println("\nenqueuing 1"); queue.enqueue(1); queue.display(); System.out.println("\nenqueuing 5"); queue.enqueue(5); queue.display(); while (!(queue.isEmpty())) { //remove head element int removedItem = queue.dequeue(); System.out.printf("%n%d dequeued%n", removedItem); queue.display(); } } }
原入队方法代码
public void enqueue(T newEntry) { Node newNode = new Node(newEntry, null); if (lastNode == null){ firstNode = lastNode = newNode; return; } lastNode.setNextNode(newNode); lastNode = newNode; numNodes++; }
问题分析
异常核心原因是numNodes计数逻辑错误:
- 队列初始为空时,添加第一个元素仅完成了firstNode和lastNode的赋值,未对numNodes执行自增操作。
- 后续元素入队时才执行
numNodes++,导致队列实际元素数量始终比numNodes统计值多1,直接影响依赖numNodes的方法(如display、isEmpty),引发显示错位、最后一个元素无法正常入队的问题。
修复方案
调整enqueue方法,确保所有入队场景都更新numNodes:
public void enqueue(T newEntry) { Node newNode = new Node(newEntry, null); if (lastNode == null) { firstNode = lastNode = newNode; } else { lastNode.setNextNode(newNode); lastNode = newNode; } // 将计数操作移到条件判断外,保证每次入队都更新元素数量 numNodes++; }
修复说明
把numNodes++移出else分支,无论队列是否为空,每添加一个元素都执行计数自增,让队列的元素计数与实际数量保持一致,后续display、dequeue等操作即可正常执行,解决元素入队错位和丢失的问题。
内容的提问来源于stack exchange,提问作者Bartek
相关产品推荐
相关产品推荐

