双向链表打印出现无限循环问题(节点数≤2时异常)
双向链表无限循环问题的原因与修复
问题根源
你的代码里**addFirst方法存在逻辑漏洞**:
当链表为空(head == null)时,你已经把head和tail都指向了新节点,但没有终止方法,后续代码继续执行了newNode.next = head和head.prev = newNode。此时head就是新节点本身,这直接导致新节点的next和prev都指向自己,形成了自环。
当你执行removeFirst后,链表只剩这个自环节点,print方法里的temp会一直指向该节点(因为temp.next还是它自己),从而陷入无限循环。
至于你说节点数大于2时能正常运行,其实是假象:最早添加的那个节点依然是自环,但遍历到它之前,前面的节点链是正常的,只是当遍历到这个自环节点时才会触发无限循环——可能你测试时没注意到这个情况。
修复方案
- 修复
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; }
- 修复
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
相关产品推荐
相关产品推荐

