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

链表节点删除问题:头节点删除功能异常排查

解决链表头节点删除无效的问题

我一眼就看出问题所在了——你的代码在删除非头节点时运行正常,但碰到删除头节点的场景就失效,比如例子里删98后输出变成0 6 1,这其实是C++里指针传参的经典坑。

问题根源

你的deleteNode函数中,head是传值参数。这意味着函数内部拿到的只是外部head指针的一个副本,当你在函数里执行head = temp->next时,修改的仅仅是这个副本的值,完全不会影响到main函数里的原始head指针。

原本的头节点被delete释放后,main里的head还指向那块已经被释放的内存,后续访问它的data就会触发未定义行为——也就是你看到的0,而真正的新头节点(6)根本没被赋值给外部的head。

两种可行的修复方案

方案1:使用指针引用传递参数

把deleteNode的head参数改成指针的引用,这样函数内部对head的修改会直接作用到外部的变量上:

void deleteNode(Node*& head, int key) {  // 这里添加&,将参数改为引用
    Node *temp = head;
    Node *prev = NULL;
    if(temp!=NULL && temp->data==key){
        head = temp->next;  // 现在修改的是外部的head指针
        delete temp;
    }
    else{
        while(temp!=NULL && temp->data!=key){
            prev = temp;
            temp = temp->next;
        }
        if(temp == NULL){
            return;
        }
        prev->next = temp->next;
        delete temp;
    }
}

修改后,main函数里的调用不需要改动,直接deleteNode(head,98)即可,函数内部对head的赋值会同步更新外部的头指针,删除头节点后就能正确输出6 1。

方案2:让函数返回更新后的头指针

参考你写的insert函数的逻辑,让deleteNode返回新的头指针,在main里重新赋值:

Node* deleteNode(Node* head, int key) {
    Node *temp = head;
    Node *prev = NULL;
    if(temp!=NULL && temp->data==key){
        head = temp->next;
        delete temp;
        return head;  // 返回新的头指针
    }
    else{
        while(temp!=NULL && temp->data!=key){
            prev = temp;
            temp = temp->next;
        }
        if(temp == NULL){
            return head;  // 没找到目标节点,返回原头指针
        }
        prev->next = temp->next;
        delete temp;
        return head;
    }
}

然后在main里调用时,要把返回值赋值给head:

head = deleteNode(head,98);

这种方式也能正确更新头指针,解决删除无效的问题。

测试验证

不管用哪种方案,重新运行你的测试案例:插入1、6、98后删除98,display函数都会输出6 1,符合预期。另外你的代码已经处理了链表为空、目标节点不存在的情况,这部分无需额外修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:57:44