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

链表跳过M个节点后删除N个节点的代码运行时错误如何解决?

代码存在的问题

1. 语法错误,exit使用不当

你代码中单独写的exit;是非法语句:

  • C语言中exit是标准库函数,调用必须传入状态码(如exit(0)),且需要引入<stdlib.h>头文件
  • 就算调用格式正确,exit会直接终止整个程序,而非退出当前linkdelete函数,完全不符合需求,应该替换为return;来终止当前函数执行。

2. 空指针访问导致运行时错误

这是你触发runtime error的核心原因:
你的外层循环是死循环while(1),当完成一轮删除操作后执行temp=temp->next,如果此时temp已经为NULL,下一轮循环进入m=M-1的遍历逻辑时,会直接执行temp=temp->next访问空指针的成员,直接触发崩溃。

3. 边界处理逻辑不完善

当跳过M个节点后,剩余节点数不足N个时,你的逻辑会直接返回,没有把temp->next设置为NULL,会导致剩余的节点没有被删除,不符合题目要求。


修正后的参考代码

void linkdelete(struct Node  *head, int M, int N)  
{  
    if(head == NULL || M <=0 || N <=0) // 提前过滤非法参数
        return;  
    struct Node* temp = head;    
    while(temp != NULL) // 替换死循环,temp为空就终止
    {   
        // 先跳M个节点
        int m = M-1;
        while(m-- && temp != NULL)   
        {   
            temp = temp->next;
        }   
        if(temp == NULL) // 剩余节点不够M个,直接结束
            return;
        
        // 找要删除的N个节点的末尾
        int n = N;      
        struct Node* t2 = temp;   
        while(n-- && t2 != NULL)
        {     
            t2 = t2->next;
        }
        // 不管够不够N个,直接把temp的next指向t2的next(t2为NULL就等于接NULL,删光剩余节点)
        if(t2 == NULL)
            temp->next = NULL;
        else
            temp->next = t2->next;
        
        // 移动temp到下一轮的起始位置
        temp = temp->next;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:24:04