JavaScript双向链表指定位置插入功能异常,请求修正优化
双向链表指定位置插入节点的代码修正
问题描述
用JavaScript实现了双向链表指定位置插入节点的程序,要求支持在链表头部、中间及尾部插入节点,但所有测试用例均无法正常运行。例如输入链表2<->4<->5,指定pos=2、data=6时,程序输出2 6 4 5,而预期输出应为2 4 5 6。需要修正代码错误,处理所有边界情况。
测试示例
示例1
- 输入:
- 链表:
2<->4<->5 - pos=2,data=6
- 链表:
- 输出:
2 4 5 6 - 解释:pos=2表示将6插入到索引为2的节点(5)之后,即链表尾部。
示例2
- 输入:
- 链表:
1<->2<->3<->4 - pos=0,data=44
- 链表:
- 输出:
1 44 2 3 4 - 解释:pos=0表示将44插入到索引为0的节点(1)之后。
错误代码分析
原代码存在以下核心问题:
- 循环定位错误:循环起始索引与条件逻辑错误,导致无法正确找到目标插入位置的前置节点。例如pos=2时,原循环会停留在链表头节点,错误地将新节点插入到头部之后。
- 变量名语义混淆:将新增节点命名为
newHead,易误解为链表新头节点,造成逻辑混乱。 - 无效判断逻辑:
if (pos > 1 && temp === null)的判断无意义,因为temp初始指向链表头,且已处理空链表情况,temp不可能为null。
修正后的代码
class Solution { addNode(head, pos, data) { const newNode = { data: data, prev: null, next: null }; if (head === null) { return newNode; } let temp = head; // 遍历到pos对应的节点,或链表最后一个节点(处理pos超出链表长度的情况) for (let i = 0; i < pos && temp.next !== null; i++) { temp = temp.next; } // 执行插入操作 newNode.next = temp.next; if (temp.next !== null) { temp.next.prev = newNode; } temp.next = newNode; newNode.prev = temp; return head; } }
修正说明
- 变量名优化:将
newHead改为newNode,明确其为新增节点而非链表头。 - 循环逻辑修正:
- 循环起始索引设为
i=0,匹配链表节点从0开始的索引规则。 - 循环条件改为
i < pos && temp.next !== null,确保准确找到pos对应的前置节点;若pos超出链表长度,则自动停在最后一个节点,将新节点插入到尾部。
- 循环起始索引设为
- 移除无效判断:删除无意义的
temp === null判断,简化逻辑。
边界情况验证
- 空链表:直接返回新节点作为链表头。
- 插入尾部:当pos大于链表最大索引时,新节点自动插入到链表末尾。
- 插入头部之后:pos=0时,新节点插入到第一个节点之后。
- 插入中间任意位置:可准确找到目标前置节点完成插入。
内容的提问来源于stack exchange,提问作者Sougata Mukherjee
相关产品推荐
相关产品推荐

