链表节点删除问题:头节点删除功能异常排查
解决链表头节点删除无效的问题
我一眼就看出问题所在了——你的代码在删除非头节点时运行正常,但碰到删除头节点的场景就失效,比如例子里删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
相关产品推荐
相关产品推荐

