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

调用exists()方法后出现段错误,双向链表deleteNode方法故障排查

双向链表段错误根因分析与修复

核心问题点

  • 空指针解引用:deleteNode方法没有处理未找到匹配id节点的场景:当遍历完整个链表都没有找到对应id的节点时,position会被赋值为NULL,后续直接访问position->prev属于非法内存访问,直接触发段错误。
  • 边界场景遗漏:当链表只有1个节点且需要删除该节点时,执行head = head->next后head会变成NULL,后续直接访问head->prev也属于空指针解引用。
  • 注:exists方法本身没有逻辑问题,段错误100%由deleteNode的逻辑漏洞触发

修复方案

修改后的deleteNode代码如下:

bool LinkedList::deleteNode(int id){
    bool didDelete = false;
    bool hasResult = false;
    Node *position;
    position = head;

    while(position!=NULL && !hasResult){
        if(id == position->data.id){
            hasResult = true;
        } else {
            std::cout << "position->next" << std::endl;
            position = position->next;
        }
    }

    // 无匹配节点直接返回
    if (position == NULL) {
        return didDelete;
    }

    // 删除头节点
    if (position->prev == NULL) {
        head = head->next;
        // 仅当删除后链表非空时设置头节点前驱
        if (head != NULL) {
            head->prev = NULL;
        }
        delete (position);
        didDelete = true;
    }
    // 删除中间节点
    else if (position->next != NULL) {
        position->prev->next = position->next;
        position->next->prev = position->prev;
        position->next = NULL;
        position->prev = NULL;
        delete(position);
        didDelete = true;
    }
    // 删除尾节点
    else{
        position->prev->next = NULL;
        position->prev = NULL;
        delete(position);
        didDelete = true;
    }

    return didDelete;
} // End of deleteNode

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:36:04