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

链表insertAtIndex方法微小改动致不同输出,为何出现死循环?

为什么两段链表插入代码仅微小差异却导致死循环?

咱们先把两段代码的核心差异拎出来对比,一眼就能看到问题所在:

第一段(死循环代码)的关键行:

Node temp=n; // temp指向当前节点n本身
n.refrence=node;
node.refrence=temp;

第二段(正常工作代码)的关键行:

Node temp=n.refrence; // temp指向n原本的下一个节点
n.refrence=node;
node.refrence=temp;

接下来咱们拆解错误代码的执行逻辑,看看死循环是怎么来的:
假设我们要在链表的某个位置插入新节点node,此时变量n已经定位到了插入位置的前一个节点(比如链表是head → A → B → null,要在A后面插入,那n就是A)。

  1. Node temp = n;:这一步让temp和n指向同一个节点(也就是A)。
  2. n.refrence = node;:把A的下一个节点改成了新节点node,现在链表变成head → A → node。
  3. node.refrence = temp;:把node的下一个节点指向temp(也就是A),这下链表直接形成了闭环:A → node → A → node → ...。

当后续遍历这个链表时,程序会一直在A和node之间无限循环,永远到不了原来的B节点,自然就出现了持续死循环的状态。

再看正确代码的逻辑:
同样以n是A为例:

  1. Node temp = n.refrence;:这一步保存的是A原本的下一个节点(也就是B)。
  2. n.refrence = node;:让A的下一个节点变成新节点node,链表变成head → A → node。
  3. node.refrence = temp;:让node的下一个节点指向之前保存的B,最终链表变成head → A → node → B → null,完全是正常的链式结构,遍历的时候能正常走完所有节点,插入功能自然正常。

简单来说,错误代码是把新节点的后继指向了前一个节点本身,形成了循环链;而正确代码是把新节点的后继指向了原本的后续节点,维持了链表的线性结构——这一点点差异,直接决定了链表是正常工作还是陷入死循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:55:16