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

C++双向链表调用删除函数后无法接收新输入问题排查

问题排查与修复方案

问题根因

  • 构造函数初始化不全:仅初始化了first指针,未初始化last指针,初始状态下last为野指针,存在非法访问风险。
  • 空指针访问:remove_last函数未校验链表是否为空,直接访问first->next,空链表调用时触发未定义行为。
  • 野指针残留:删除链表最后一个节点后,没有将first、last指针重置为NULL,后续调用append时无法识别链表为空,尝试访问野指针内存,导致新节点无法正常插入。
  • 无边界校验:触发#删除逻辑时未判断链表剩余节点数量,#数量超过已有字符数时会重复调用空链表的删除逻辑,放大上述问题。

修复代码

1. 修复构造函数

doubleList() : first(nullptr), last(nullptr) {} // 同时初始化头尾指针

2. 修复remove_last函数

void doubleList::remove_last()
{
    // 空链表直接返回,不做处理
    if (first == nullptr) {
        return;
    }
    // 仅存一个节点的场景
    if (first->next == nullptr) {
        delete first;
        // 重置头尾指针避免野指针
        first = nullptr;
        last = nullptr;
        return;
    }
    // 多节点场景删除尾节点
    Node* toDelete = last;
    last = last->prev;
    delete toDelete;
    last->next = nullptr;
}

3. 可选优化(更严谨的删除逻辑)

修复remove_last后原有逻辑已经可以正常运行,也可以进一步优化main中的删除逻辑避免无效调用:

if (ch[i] == '#')
{
    list.remove_last(); // 删除刚追加的#
    // 还有剩余节点才删除前一个输入字符
    if (list.first != nullptr) {
        list.remove_last();
    }
}

验证效果

修复后输入ab#####efgh,程序会正确输出efgh,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:27:03