Java实现Doubly Linked List打印时无输出且程序持续运行问题求助
问题原因
核心问题是addLast方法的节点指向逻辑混乱,混用了哨兵节点和非哨兵节点的实现思路,最终导致链表出现环形引用,打印方法进入死循环:
- 构造函数中初始化了两个空的哨兵节点作为初始head和tail,但后续添加元素时直接修改了head和tail的指向,破坏了哨兵节点的设计逻辑
- 创建新节点时错误地将新节点的
myNext指向了当前的tail节点,第二次添加元素后,最后一个节点的next指向了前一个节点,前一个节点的next又指向最后一个节点,形成循环,displayList的while循环永远无法终止 - 首次添加元素的指针赋值逻辑错误,没有正确处理首尾节点的前后指向关联
修复方案
这里提供两种常用实现方案,二选一即可:
方案1:不使用哨兵节点(实现更简单)
- 修改构造函数,直接将首尾指针初始化为null
public Box() { head = null; tail = null; size = 0; }
- 修正
addLast的节点指向逻辑
public void addLast(E data) { // 新节点前指针指向旧尾节点,后指针初始为null DoubleListNode<E> newNode = new DoubleListNode<>(tail, data, null); if(size == 0) { // 空链表时首尾都指向新节点 head = newNode; } else { // 非空时旧尾节点的后指针指向新节点 tail.myNext = newNode; } tail = newNode; size++; }
- 优化
displayList的空链表处理逻辑
public void displayList() { if (size == 0) { System.out.println("Empty List"); return; } DoubleListNode<E> temp = head; while (temp != null) { System.out.print(temp.myData + " --> "); temp = temp.myNext; } System.out.println("Null"); }
方案2:使用哨兵节点(边界处理更统一)
- 修改构造函数,初始化首尾哨兵节点并建立关联
public Box() { head = new DoubleListNode<>(); tail = new DoubleListNode<>(); // 两个哨兵节点互相指向,中间存储数据节点 head.myNext = tail; tail.myPrev = head; size = 0; }
- 修正
addLast的插入逻辑,永远插在尾哨兵前面
public void addLast(E data) { DoubleListNode<E> newNode = new DoubleListNode<>(tail.myPrev, data, tail); tail.myPrev.myNext = newNode; tail.myPrev = newNode; size++; }
- 修正
displayList的遍历逻辑,跳过首尾哨兵
public void displayList() { if (size == 0) { System.out.println("Empty List"); return; } DoubleListNode<E> temp = head.myNext; while (temp != tail) { System.out.print(temp.myData + " --> "); temp = temp.myNext; } System.out.println("Null"); }
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

