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

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)之后。

错误代码分析

原代码存在以下核心问题:

  1. 循环定位错误:循环起始索引与条件逻辑错误,导致无法正确找到目标插入位置的前置节点。例如pos=2时,原循环会停留在链表头节点,错误地将新节点插入到头部之后。
  2. 变量名语义混淆:将新增节点命名为newHead,易误解为链表新头节点,造成逻辑混乱。
  3. 无效判断逻辑: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;
    }
}

修正说明

  1. 变量名优化:将newHead改为newNode,明确其为新增节点而非链表头。
  2. 循环逻辑修正:
    • 循环起始索引设为i=0,匹配链表节点从0开始的索引规则。
    • 循环条件改为i < pos && temp.next !== null,确保准确找到pos对应的前置节点;若pos超出链表长度,则自动停在最后一个节点,将新节点插入到尾部。
  3. 移除无效判断:删除无意义的temp === null判断,简化逻辑。

边界情况验证

  • 空链表:直接返回新节点作为链表头。
  • 插入尾部:当pos大于链表最大索引时,新节点自动插入到链表末尾。
  • 插入头部之后:pos=0时,新节点插入到第一个节点之后。
  • 插入中间任意位置:可准确找到目标前置节点完成插入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:24:58