You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双向链表打印出现无限循环问题(节点数≤2时异常)

双向链表无限循环问题的原因与修复

问题根源

你的代码里**addFirst方法存在逻辑漏洞**:
当链表为空(head == null)时,你已经把head和tail都指向了新节点,但没有终止方法,后续代码继续执行了newNode.next = head和head.prev = newNode。此时head就是新节点本身,这直接导致新节点的next和prev都指向自己,形成了自环。

当你执行removeFirst后,链表只剩这个自环节点,print方法里的temp会一直指向该节点(因为temp.next还是它自己),从而陷入无限循环。

至于你说节点数大于2时能正常运行,其实是假象:最早添加的那个节点依然是自环,但遍历到它之前,前面的节点链是正常的,只是当遍历到这个自环节点时才会触发无限循环——可能你测试时没注意到这个情况。

修复方案

  1. 修复addFirst方法:在空链表的分支里添加return,避免后续代码执行:
public void addFirst(int data){
    Node newNode = new Node(data);
    if(head == null){
        head = tail = newNode;
        return; // 新增这一行,终止方法
    }
    newNode.next = head;
    head.prev = newNode;
    head = newNode;
}
  1. 修复removeFirst方法:当链表只剩一个节点时,要同时置空tail,避免悬空引用:
public void removeFirst(){
    if(head == null){
        System.out.println("链表已为空");
        return;
    }
    if(head.next == null){
        head = tail = null; // 同时置空tail
        return;
    }
    head = head.next;
    head.prev = null;
}

验证

修复后再运行你的测试代码:

  • 先添加两个节点,打印会输出343<-->8<-->null
  • 执行removeFirst后,链表只剩8的节点,打印会输出8<-->null,不会再无限循环。

内容的提问来源于stack exchange,提问作者SBM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:25:25