如何遍历打印泛型LinkedList Queue队列的所有元素
问题原因
你当前的代码有两个核心问题,会导致既无法完成遍历,还会触发死循环:
peek()方法的作用仅为查看队首元素,不会移除队首元素,也不会移动遍历位置。循环中反复调用peek()只要队列不为空,永远返回同一个队首元素,hasMore变量也永远不会被置为false,直接进入死循环。- 直接打印
newt.head拿到的是队首节点对象本身,不是节点存储的业务数据,且你没有顺着节点的向后引用移动指针,自然无法获取后续元素。
遍历方案
根据你是否需要保留队列原有元素,选对应实现即可:
方案1:遍历后保留队列所有元素
如果只是打印内容,遍历结束后队列元素还要正常使用,优先用迭代器遍历(LinkedList本身实现了可迭代接口,不需要手动操作节点):
public void printProcessQueue() { // 如果你的Queue指定了泛型,比如Queue<String>,就把Object替换为对应泛型类型 for (Object element : newt) { System.out.println(element); } }
如果是你自己实现的LinkedList结构,想手动顺着节点遍历,可以从队首节点开始,沿着next指针向后走,直到节点为空:
public void printProcessQueue() { // 假设你自定义的链表节点类为Node,item属性存数据,next属性指向下一个节点 Node current = newt.head; while (current != null) { System.out.println(current.item); // 打印节点存储的数据,而非节点对象本身 current = current.next; // 指针移动到下一个节点 } }
方案2:遍历后消费所有元素(队列清空)
如果你的业务逻辑是处理完队列元素就把元素移除(符合队列先进先出的消费场景),直接用poll()方法即可,该方法会取出并移除队首元素,队列为空时返回null:
public void printProcessQueue() { Object element; while ((element = newt.poll()) != null) { System.out.println(element); } }
注意事项
- 如果你用的是JDK自带的
java.util.LinkedList作为Queue实现,不要直接访问内部的head字段,这是类的私有内部属性,不同JDK版本的字段命名、实现逻辑可能有差异,直接访问会有兼容性问题,统一用队列暴露的公共方法操作即可。 - 不要用
peek()作为循环终止的判断条件,它只做元素读取不做移除,只要队列非空就永远返回非null值,必然触发死循环。
内容的提问来源于stack exchange,提问作者OMeihls
相关产品推荐
相关产品推荐

