链表指定值节点删除:C语言代码出现段错误,求排查错误原因
问题分析与修复
你的代码出现段错误主要有三个核心问题:
- 当要删除的是头节点时,
prev初始为NULL,此时访问prev->next会触发空指针解引用,直接导致段错误。 - 删除节点后,循环里的
tmp = tmp->next会访问已经被free的内存,属于未定义行为,可能引发崩溃或其他异常。 - 若头节点被删除,函数仍返回原来的
head,这会返回一个已被释放的无效指针,后续使用会出问题。
下面是修复后的代码,用**哑节点(哨兵节点)**的方式解决这些问题,逻辑更简洁健壮:
struct ListNode *removeElements(struct ListNode *head, int val) { // 创建哑节点,作为原头节点的前驱,避免单独处理头节点的特殊情况 struct ListNode dummy; dummy.next = head; struct ListNode *prev = &dummy; struct ListNode *tmp; while (prev->next != NULL) { if (prev->next->val == val) { tmp = prev->next; // 跳过要删除的节点 prev->next = tmp->next; // 释放节点内存 free(tmp); } else { // 当前节点不需要删除,移动prev指针 prev = prev->next; } } // 返回新的头节点(可能是原头节点,也可能是后续节点) return dummy.next; }
修复逻辑说明
- 哑节点
dummy的作用是统一所有节点的处理逻辑,不管原头节点是否需要删除,都能通过prev->next访问到目标节点,避免空指针问题。 - 遍历过程中始终通过
prev的下一个节点判断是否需要删除,删除时直接调整prev的指针指向,不会出现访问已释放内存的情况。 - 最终返回
dummy.next,确保返回的是有效的新头节点,无论原头节点是否被删除。
内容的提问来源于stack exchange,提问作者iskander
相关产品推荐
相关产品推荐

