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

C语言未排序单链表删除所有目标值节点代码问题修复咨询

单链表删除所有目标值节点问题修复

原有代码核心问题

  • 头节点处理逻辑缺陷:删除头节点后未更新firstNode的指向,导致头节点地址丢失,且头节点判断逻辑放在循环内,会出现漏删、野指针问题
  • 循环逻辑错误:循环条件仅判断current->next != NULL,若链表仅含单个节点且等于目标值,将直接跳过删除逻辑;同时每次循环无论是否完成删除操作都直接移动current指针,会出现节点漏判的问题
  • 函数无返回值:声明为void*类型但未返回更新后的头节点,调用方无法拿到修改后的链表首地址

修复方案

推荐使用哨兵哑节点方案,无需单独处理头节点边界情况,逻辑更统一:

  1. 定义一个临时的哑节点作为临时头,将其next指向原链表首节点,所有删除逻辑统一用current->next判断,无需单独处理首节点
  2. 循环遍历整个链表,遇到等于目标值的节点就删除,删除时不移动current指针,仅更新current->next的指向,避免漏判后续节点
  3. 最终返回哑节点的next作为新的链表首节点即可

修正后完整代码

typedef struct Node
{
    int data;
    struct Node *next;
} no;

no* toDElduplicatedlinkedlist (no* firstNode, int target)
{
    // 定义哨兵哑节点
    no dummy;
    dummy.next = firstNode;
    no* current = &dummy;
    no* ptemp;

    while (current->next != NULL)
    {
        if (current->next->data == target)
        {
            ptemp = current->next;
            current->next = current->next->next;
            free(ptemp);
            // 删除节点后不移动current,继续判断新的current->next
        }
        else
        {
            // 未匹配到目标值才移动current
            current = current->next;
        }
    }
    // 返回新的头节点
    return dummy.next;
}

调用方式

原有头指针调用时直接接收返回值即可:

// head为原链表首节点指针
head = toDElduplicatedlinkedlist(head, 2);

内容的提问来源于stack exchange,提问作者Rosha. R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:45:04