C++双向链表删除指定元素异常求助:误删整个链表
双向链表删除指定值的问题修复
原代码的核心问题
- 无效的删除操作:找到目标节点后,先将
curr赋值为nullptr再执行delete,等于没有删除任何有效节点,反而丢失了指向目标节点的指针。 - 未维护双向链表的指针关联:双向链表删除节点必须调整目标节点的前驱节点
next指针和后继节点prev指针,原代码完全忽略这一步,导致链表结构直接断裂。 - 空指针访问违规:将
curr设为nullptr后,后续执行curr = curr->next会触发空指针访问,引发内存混乱,这就是你看到“删除整个链表”的原因。
修正后的代码
void deleteSpecificValue(int val) { if (head == nullptr) { cout << "List Is Empty" << endl; return; } Node* curr = head; int result = 0; while (curr != nullptr) { // 先保存下一个节点,避免删除当前节点后丢失遍历路径 Node* nextNode = curr->next; if (curr->data == val) { cout << "Value Deleted" << endl; result = 1; // 处理前驱节点的指针 if (curr->prev != nullptr) { curr->prev->next = curr->next; } else { // 当前节点是头节点,更新链表头指针 head = curr->next; } // 处理后继节点的指针 if (curr->next != nullptr) { curr->next->prev = curr->prev; } // 正确释放当前节点的内存 delete curr; } // 使用保存的下一个节点继续遍历 curr = nextNode; } if (result != 1) { cout << "The Value To Be Deleted Is Not Found" << endl; } }
关键修正说明
- 提前保存后继节点:在处理当前节点前先保存
curr->next,避免删除节点后无法继续遍历链表。 - 分情况调整指针:
- 如果目标节点是头节点,直接更新
head为后继节点; - 如果目标节点有前驱,让前驱的
next指向后继; - 如果目标节点有后继,让后继的
prev指向前驱。
- 如果目标节点是头节点,直接更新
- 正确释放内存:在调整完所有指针后,再删除目标节点,避免链表结构混乱。
额外补充
- 如果你的双向链表维护了
tail指针,当删除的是尾节点时,需要额外添加tail = curr->prev来更新尾指针,防止悬空。 - 上述代码会删除所有匹配
val的节点,若只需删除第一个匹配节点,在处理完指针和删除操作后,直接添加break即可跳出循环。
内容的提问来源于stack exchange,提问作者Trying_To_be_a_coder
相关产品推荐
相关产品推荐

