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

链表删除指定元素出现运行时错误,请求排查问题

排查链表Delete操作的无限循环问题

我看到你的deleteinbtw函数里藏着一个无限循环的问题,这就是程序冻结的根源!咱们来一步步拆解问题:

核心问题分析

  1. 无限循环触发点:你把temp=temp->next;放在了while循环的外面,这意味着进入else分支后,循环里的temp永远不会向后移动。只要temp->next不为NULL,循环就会一直跑下去,直接导致程序卡死。
  2. 删除后未终止循环:就算侥幸找到目标节点并删除,程序还是会继续循环,可能会访问已经被释放的内存,引发未定义行为。
  3. 未初始化的指针:Node *temp=listptr, *temp1;;里的temp1没有初始化,虽然实际使用前会赋值,但养成初始化的习惯能避免野指针风险。

修正后的代码

void List::deleteinbtw(int num) {
    Node *temp = listptr;
    Node *temp1 = nullptr; // 初始化指针,避免野指针风险

    if (listptr == NULL) {
        cout << "\nList is Empty!\n";
        return; // 空链表直接返回,避免后续无效操作
    }

    // 处理头节点就是目标的情况
    if (temp->data == num) {
        listptr = listptr->next;
        delete temp;
        return; // 删除后直接返回,不用走后面的逻辑
    }

    // 遍历寻找中间/尾节点
    while (temp->next != NULL) {
        if (temp->next->data == num) {
            temp1 = temp->next;
            temp->next = temp1->next;
            delete temp1;
            return; // 删除成功后立即退出循环,避免无效遍历
        }
        temp = temp->next; // 每次循环移动temp,正常遍历链表
    }

    // 如果走到这里,说明没找到目标节点
    cout << "\nNode with value " << num << " not found in the list!\n";
}

关键修改说明

  • 把temp=temp->next;移到了while循环内部,确保每次循环temp都会向后移动,正常遍历整个链表,彻底解决无限循环问题。
  • 在删除头节点和找到目标节点后都添加了return,既避免后续不必要的操作,也防止删除后继续循环导致的内存访问错误。
  • 初始化temp1为nullptr,规范指针使用,降低野指针风险。
  • 增加了未找到目标节点的提示,让程序的反馈更清晰友好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:43:03