C语言未排序单链表删除所有目标值节点代码问题修复咨询
单链表删除所有目标值节点问题修复
原有代码核心问题
- 头节点处理逻辑缺陷:删除头节点后未更新
firstNode的指向,导致头节点地址丢失,且头节点判断逻辑放在循环内,会出现漏删、野指针问题 - 循环逻辑错误:循环条件仅判断
current->next != NULL,若链表仅含单个节点且等于目标值,将直接跳过删除逻辑;同时每次循环无论是否完成删除操作都直接移动current指针,会出现节点漏判的问题 - 函数无返回值:声明为
void*类型但未返回更新后的头节点,调用方无法拿到修改后的链表首地址
修复方案
推荐使用哨兵哑节点方案,无需单独处理头节点边界情况,逻辑更统一:
- 定义一个临时的哑节点作为临时头,将其
next指向原链表首节点,所有删除逻辑统一用current->next判断,无需单独处理首节点 - 循环遍历整个链表,遇到等于目标值的节点就删除,删除时不移动
current指针,仅更新current->next的指向,避免漏判后续节点 - 最终返回哑节点的
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
相关产品推荐
相关产品推荐

