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

链表指定值节点删除:C语言代码出现段错误,求排查错误原因

问题分析与修复

你的代码出现段错误主要有三个核心问题:

  • 当要删除的是头节点时,prev初始为NULL,此时访问prev->next会触发空指针解引用,直接导致段错误。
  • 删除节点后,循环里的tmp = tmp->next会访问已经被free的内存,属于未定义行为,可能引发崩溃或其他异常。
  • 若头节点被删除,函数仍返回原来的head,这会返回一个已被释放的无效指针,后续使用会出问题。

下面是修复后的代码,用**哑节点(哨兵节点)**的方式解决这些问题,逻辑更简洁健壮:

struct ListNode *removeElements(struct ListNode *head, int val) {
    // 创建哑节点,作为原头节点的前驱,避免单独处理头节点的特殊情况
    struct ListNode dummy;
    dummy.next = head;
    struct ListNode *prev = &dummy;
    struct ListNode *tmp;

    while (prev->next != NULL) {
        if (prev->next->val == val) {
            tmp = prev->next;
            // 跳过要删除的节点
            prev->next = tmp->next;
            // 释放节点内存
            free(tmp);
        } else {
            // 当前节点不需要删除,移动prev指针
            prev = prev->next;
        }
    }

    // 返回新的头节点(可能是原头节点,也可能是后续节点)
    return dummy.next;
}

修复逻辑说明

  1. 哑节点dummy的作用是统一所有节点的处理逻辑,不管原头节点是否需要删除,都能通过prev->next访问到目标节点,避免空指针问题。
  2. 遍历过程中始终通过prev的下一个节点判断是否需要删除,删除时直接调整prev的指针指向,不会出现访问已释放内存的情况。
  3. 最终返回dummy.next,确保返回的是有效的新头节点,无论原头节点是否被删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:53:23