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

C++删除链表元素时如何指向后继节点,解决下标越界range_error报错

问题分析与修复

报错直接原因

触发std::range_error的核心原因是代码中调用get_node时传入了非法索引,现有实现存在多处逻辑缺陷:

  • 未做前置索引合法性校验:没有判断传入的index是否落在[0, 链表总长度-1]的合法区间,也没有兼容链表为空的场景,直接调用get_node就可能触发越界异常
  • 边界场景索引非法:删除索引为0的头节点时,调用get_node(index-1)即get_node(-1)直接触发越界;删除链表最后一个节点时,调用get_node(index+1)也会超出合法索引范围
  • 冗余调用增加风险:双向链表的节点本身就存储了prev(前驱)和next(后继)指针,无需调用三次get_node分别获取当前节点、前驱、后继,冗余调用不仅性能差,还额外增加了越界概率
  • 双向链表逻辑不完整:仅修改了前驱节点的next指针,未修改后继节点的prev指针,会导致链表前向遍历链路断裂
  • 特殊节点未更新:删除头节点后需要将链表的head指针指向原头节点的后继节点,若链表实现了尾指针缓存,删除尾节点时也需要同步更新尾指针

修正后代码

void remove(int index)
{
    // 前置校验:链表为空、索引非法直接抛出异常,可根据自身需求调整为直接返回
    int list_len = get_list_length(); // 替换为你自身实现的获取链表长度的方法
    if (head == NULL || index < 0 || index >= list_len) {
        throw std::range_error("IndexError: Index out of range");
    }

    Node *current = get_node(index);
    // 处理前驱节点逻辑
    if (current->prev != nullptr) {
        current->prev->next = current->next;
    } else {
        // 当前是头节点,更新head指针
        head = current->next;
    }
    // 处理后继节点逻辑
    if (current->next != nullptr) {
        current->next->prev = current->prev;
    }
    // 释放当前节点内存
    delete current;
}

内容的提问来源于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.28 18:06:09