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.
相关产品推荐
相关产品推荐

