链表跳过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
相关产品推荐
相关产品推荐

