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

C++双向链表insert方法实现触发索引越界异常问题求助

问题产生原因

  • size成员变量完全未生效:LinkedList类中定义的public成员size既没有在构造函数中初始化,也没有在append插入元素时更新,存储的是内存随机脏值。get_node方法中判断index >= size的边界校验逻辑完全失效,你调用a.insert(3,1)时内部要调用get_node(0),如果此时size的脏值刚好小于等于0,就会直接触发range_error异常。
  • append方法逻辑存在严重缺陷:现有append只处理了空链表插入第一个节点、只有头节点插入第二个节点的情况,插入第三个及以上节点时没有任何处理逻辑,你调用5次append实际只有前两个节点正确接入链表,后续3、4、5节点全部丢失,tail指针也不会更新,链表实际长度和你预期的5完全不符。
  • insert方法实现不完整:现有代码只修改了前驱节点的next指针指向新节点,新节点的prev、next指针完全没有赋值,后继节点的prev指针也没有修改,也没有处理插入位置为头、插入位置为尾部的边界情况,即使越界问题修复也会后续触发空指针访问崩溃。

修复方案

1. 修正size变量的管理

构造函数初始化size为0,每次成功插入元素(append、insert)后size自增1。

2. 重写append方法

void append(int value)
{
    Node *new_node = new Node(value);
    size++;
    if (head == nullptr)
    {
        head = new_node;
        tail = new_node;
        return;
    }
    tail->next = new_node;
    new_node->prev = tail;
    tail = new_node;
}

3. 重写insert方法

void insert(int val, int index)
{
    // 先校验插入索引合法性:允许插入到0到size的位置(插入到size就是尾插)
    if (index < 0 || index > size)
    {
        throw range_error("IndexError: Index out of range");
    }
    // 头插情况
    if (index == 0)
    {
        Node *new_node = new Node(val);
        new_node->next = head;
        if (head != nullptr)
        {
            head->prev = new_node;
        }
        head = new_node;
        // 如果是空链表插入,tail也要指向新节点
        if (tail == nullptr)
        {
            tail = new_node;
        }
        size++;
        return;
    }
    // 尾插情况直接调用append
    if (index == size)
    {
        append(val);
        return;
    }
    // 中间插入
    Node *prev_node = get_node(index - 1);
    Node *next_node = prev_node->next;
    Node *new_node = new Node(val);
    new_node->prev = prev_node;
    new_node->next = next_node;
    prev_node->next = new_node;
    next_node->prev = new_node;
    size++;
}

4. 修复print方法的空指针风险

void print()
{
    Node *current = head;
    cout << "[";
    while (current != nullptr)
    {
        cout << current->value;
        if (current->next != nullptr)
        {
            cout << ", ";
        }
        current = current->next;
    }
    cout << "]" << endl;
}

5. 构造函数补充size初始化

LinkedList()
{
    head = nullptr;
    tail = nullptr;
    size = 0;
}

修复后运行测试代码就可以得到预期输出:

[1, 2, 3, 4, 5]
[1, 3, 2, 3, 4, 5]

内容的提问来源于stack exchange,提问作者N.A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:24:03