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

C++链表删除偶数节点代码求助:逻辑错误排查

问题分析与修复

先拆解你代码里的几个致命问题:

  • 变量名拼写错误:定义的是nod *curent;,但后续赋值用了current = head;,变量名不一致直接导致编译失败。
  • 野指针风险:aux未初始化就直接用于指针赋值,会破坏链表结构甚至引发程序崩溃。
  • 空指针访问漏洞:当链表只有一个节点时,curent->next为NULL,此时访问curent->next->info会触发空指针异常。
  • 逻辑完全偏离目标:你的需求是删除第二个偶数节点,但代码里的指针跳转和赋值逻辑完全错误,根本没实现“将第一个节点与第三个节点相连”的操作。

针对需求的修正代码

如果你的目标是检查第二个节点是否为偶数,若是则删除它,正确实现如下:

void delete_even()
{
    if (head == NULL)
    {
        cout << "List doesn't exist!";
        return;
    }
    // 先判断是否存在第二个节点
    if (head->next == NULL)
    {
        cout << "No second node to check!";
        return;
    }
    
    nod *aux = head->next; // 保存要删除的第二个节点
    if (aux->info % 2 == 0)
    {
        head->next = aux->next; // 第一个节点直接连到第三个节点
        delete aux; // 释放内存
        cout << "Second even node deleted!";
    }
    else
    {
        cout << "Second node is not even!";
    }
}

如果你的需求是遍历整个链表,删除所有值为偶数的后继节点,修正后的遍历版本如下:

void delete_even()
{
    if (head == NULL)
    {
        cout << "List doesn't exist!";
        return;
    }
    
    nod *current = head;
    while (current != NULL && current->next != NULL)
    {
        if (current->next->info % 2 == 0)
        {
            nod *aux = current->next; // 暂存要删除的节点
            current->next = aux->next; // 跳过要删除的节点
            delete aux; // 释放内存
            // 若只需删除第一个符合条件的节点,取消下面的注释
            // break;
        }
        else
        {
            current = current->next; // 继续遍历下一个节点
        }
    }
}

核心逻辑说明

删除链表节点的标准步骤:

  1. 暂存要删除的节点,避免指针丢失;
  2. 让前一个节点的next指向要删除节点的next,完成链表链路跳转;
  3. 释放暂存节点的内存,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:20:40