C语言单链表删除指定值节点仅移除一个问题排查
问题原因
- 删除函数仅执行单次删除:
deleteNode函数找到第一个匹配目标值的节点并完成删除后就直接终止运行,没有遍历完整条链表查找所有符合条件的节点,因此只能移除1个目标节点。 - 头节点删除逻辑错误:当需要删除的节点是头节点时,原代码仅释放了头节点的内存,没有更新头指针
*head指向新的头节点,会导致链表断裂,触发野指针访问问题。 - 代码存在语法不规范问题:
addBack函数的第一个参数类型写为struct node **,和定义的结构体名struct NODE大小写不统一,部分编译器会抛出类型不匹配错误;参数名new是C++关键字,虽然C语言中可正常使用,但易产生歧义。
修复方案
- 重构
deleteNode函数逻辑:循环遍历整条链表,匹配到所有目标值节点都执行删除操作;删除头节点时正确更新头指针,删除任意节点后都继续向后遍历,不要提前返回。 - 修正
addBack函数的参数类型为struct NODE **,将deleteNode的参数名new改为target避免歧义。
修正后的核心代码
deleteNode 函数
void deleteNode(struct NODE** head, int target) { struct NODE *curr = *head, *prev = NULL; while (curr != NULL) { if (curr->value == target) { // 处理头节点删除场景 if (prev == NULL) { *head = curr->prev; free(curr); curr = *head; } // 处理普通节点删除场景 else { prev->prev = curr->prev; free(curr); curr = prev->prev; } } // 节点不匹配,向后移动指针 else { prev = curr; curr = curr->prev; } } }
addBack 函数定义修正
// 原参数类型struct node改为和结构体定义一致的struct NODE void addBack(struct NODE **head, int val)
修改完成后调用deleteNode即可删除链表中所有值为3的节点。
内容的提问来源于stack exchange,提问作者Steven Yelnats
相关产品推荐
相关产品推荐

