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

C++链表pop方法删除指定节点时崩溃问题求助

LinkedList的pop方法崩溃问题修复

问题重现

实现LinkedList类的pop方法删除包含指定(n1, n2)数据的节点时,单次删除首节点操作正常;但执行多次删除(包括中间、末尾、首节点)时程序崩溃,退出码为3221225477。

错误原因

pop方法中的循环条件逻辑错误:
原循环条件为:

while (temp != NULL && temp->n1 != n1 && temp->n2 != n2)

这个条件的含义是只有当节点的n1和n2都不等于目标值时才继续遍历,这会导致只要节点的n1或n2其中一个匹配目标值,循环就会停止。例如删除(0,5)时,遇到首节点(0,0),由于temp->n1 !=0为false,整个条件不成立,循环直接终止。此时prev仍为NULL,执行prev->next会触发空指针访问,导致程序崩溃。

正确的循环条件应该是当节点的n1和n2不同时匹配目标值时继续遍历,即使用逻辑或(||)来判断不匹配的情况,或者用逻辑非包裹匹配条件。

修复后的pop方法

void pop(int n1, int n2)
{
    Node *temp = this->start;
    Node *prev = NULL;

    if (temp != NULL && temp->n1 == n1 && temp->n2 == n2)
    {
        this->start = temp->next;
        delete temp;
        this->size--;
        return;
    }
    else
    {
        // 修改循环条件:当节点未匹配目标时继续遍历
        while (temp != NULL && !(temp->n1 == n1 && temp->n2 == n2))
        {
            prev = temp;
            temp = temp->next;
        }
        if (temp == NULL)
        {
            return;
        }
        prev->next = temp->next;
        this->size--;
        delete temp;
    }
}

也可以将循环条件写成等价的形式:

while (temp != NULL && (temp->n1 != n1 || temp->n2 != n2))

测试验证

运行测试代码2:

int main(int argc, char const *argv[])
{
    LinkedList lk;
    lk.append(0, 0);
    lk.append(0, 1);
    lk.append(0, 2);
    lk.append(0, 3);
    lk.append(0, 5);
    lk.append(0, 6);

    lk.pop(0, 5);
    lk.pop(0, 1);
    lk.pop(0, 0);
    lk.pop(0, 6);

    lk.print();

    return 0;
}

输出符合预期:

n1: 0, n2: 2
n1: 0, n2: 3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:15:34