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

双向链表删除连续奇数块时出现段错误,求修复方法

修复双向链表连续奇数块删除的段错误问题

咱们先看看你代码里触发段错误的几个核心问题哈:

  • 空指针非法访问:如果链表最后几个节点全是奇数,内层循环里wp = wp->next后wp会变成nullptr,这时候再执行wp->prev = del_el->prev就会直接访问空指针,触发段错误。
  • 双向链表指针调整不完整:你只更新了后继节点的prev,但没处理前驱节点的next——比如删除中间的奇数块时,前面的偶数节点的next应该指向当前的wp;如果删除的是链表开头的奇数块,甚至需要更新头指针Start,这些你的代码都没做。
  • 遍历指针跳跃错误:处理完奇数块后,wp已经指向了下一个偶数节点,外层循环又执行wp = wp->next,会直接跳过这个偶数节点,导致后续逻辑混乱。

修复后的完整代码

void delete_odd_el(Tsnum *&Start) {
    Tsnum *wp = Start;
    while (wp != nullptr) {
        // 遇到奇数块的起始节点
        if (wp->num % 2 == 1) {
            Tsnum *block_start = wp; // 记录当前奇数块的起始位置
            // 先遍历找到奇数块的结束位置(直到遇到偶数或链表末尾)
            while (wp != nullptr && wp->num % 2 == 1) {
                wp = wp->next;
            }
            Tsnum *prev_node = block_start->prev; // 奇数块的前驱节点
            // 调整前驱节点的next指针
            if (prev_node != nullptr) {
                prev_node->next = wp;
            } else {
                // 前驱为空说明删除的是链表头部,更新头指针
                Start = wp;
            }
            // 调整后继节点的prev指针(如果后继节点存在)
            if (wp != nullptr) {
                wp->prev = prev_node;
            }
            // 逐个删除奇数块内的所有节点
            Tsnum *del_el = block_start;
            while (del_el != wp) {
                Tsnum *next_del = del_el->next;
                delete del_el;
                del_el = next_del;
            }
        } else {
            // 当前是偶数节点,直接移动到下一个节点继续遍历
            wp = wp->next;
        }
    }
}

修复思路拆解:

  1. 先定位再操作:先完整找到整个奇数块的范围(从block_start到wp之前的节点),再统一调整前后指针,避免边删边调导致的空指针问题。
  2. 双向指针完整更新:同时处理前驱节点的next和后继节点的prev,确保链表的双向链接始终有效;特殊处理头节点被删除的情况,及时更新Start。
  3. 合理的遍历逻辑:处理完奇数块后,wp已经指向了下一个需要处理的节点,只有遇到偶数节点时才手动移动wp,避免跳过节点。
  4. 安全删除节点:先保存每个要删除节点的下一个节点,再执行删除,防止删除后丢失指针无法继续遍历。

内容的提问来源于stack exchange,提问作者Alex Fr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:02:58