You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
    }
}

关键修正说明

  1. 提前保存后继节点:在处理当前节点前先保存curr->next,避免删除节点后无法继续遍历链表。
  2. 分情况调整指针:
    • 如果目标节点是头节点,直接更新head为后继节点;
    • 如果目标节点有前驱,让前驱的next指向后继;
    • 如果目标节点有后继,让后继的prev指向前驱。
  3. 正确释放内存:在调整完所有指针后,再删除目标节点,避免链表结构混乱。

额外补充

  • 如果你的双向链表维护了tail指针,当删除的是尾节点时,需要额外添加tail = curr->prev来更新尾指针,防止悬空。
  • 上述代码会删除所有匹配val的节点,若只需删除第一个匹配节点,在处理完指针和删除操作后,直接添加break即可跳出循环。

内容的提问来源于stack exchange,提问作者Trying_To_be_a_coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:20:28