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

双向链表pop_back函数空指针错误排查求助

问题分析与修复方案

让我来帮你排查下双向链表pop_back函数出现空指针错误的问题:

1. 核心问题:未处理边界情况引发的空指针与野指针

你的pop_back函数开头直接访问tail->value,但如果链表是空的(比如还没调用过push_back,或者已经把所有元素都弹出了),tail会是nullptr,这时候直接访问它的成员必然触发空指针异常。

另外,当链表只剩最后一个元素时,你只重置了tail为NULL,但head仍然指向已经被删除的节点,变成了野指针,后续操作会引发未定义行为。

2. 修复后的pop_back函数

double linked_list::pop_back() {
    // 先判断链表是否为空,避免空指针访问
    if (tail == nullptr) {
        // 这里可以根据业务需求选择处理方式,比如抛出异常或返回特殊值
        throw std::out_of_range("Cannot pop from an empty linked list");
    }

    double value = tail->value;
    if (size() == 1) {
        delete tail;
        tail = nullptr;
        head = nullptr; // 同时重置head,避免野指针
    } else {
        node_t* temp = tail->prev;
        temp->next = nullptr;
        delete tail;
        tail = temp;
    }
    // 别忘了同步更新size计数(如果你的size()是维护的成员变量而非实时计算)
    // size--;
    return value;
}

3. push_back函数的小优化

你的push_back里有一行多余的赋值:n->value = value;,因为你已经通过node_t *n = new node_t(value);初始化了节点的value,这行可以删掉,优化后的代码:

void linked_list::push_back(double value) {
    node_t* n = new node_t(value); // 构造时已初始化value
    n->next = nullptr;
    n->prev = tail;

    if (head == nullptr) {
        head = n;
    } else {
        tail->next = n;
    }

    tail = n;
    // 同步更新size计数
    // size++;
}

额外提醒

请确保你的size()函数是正确维护的:每次push_back要递增size,pop_back要递减size。如果size()是通过遍历链表计算的,那效率会很低,建议用一个成员变量来维护当前链表的元素数量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:04:07