【实用博文】关于力扣牛客上面的接口型题目出bug时在VS上的调试问题
大家好,我是安然无虞。
每篇前言
博客主页:安然无虞
作者认证:2021年博客新星Top2
咱的口号:🌹小比特,大梦想🌹
作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请铁汁批评斧正。
火爆专栏:蓝桥杯基础算法剖析
直接进入今天的主题,有这么一道链表题:
力扣上面是以接口的形式给出,不需要我们写IO函数,是这样的:
那么经常会有同学问如果代码出错了,图也一步步画了,也仔细查看代码了,但是就是找不出哪里出错了,比如上面这道题,我们一开始没有考虑全面,很容易写成这样:
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode* prev = NULL;
struct ListNode* cur = head;
while(cur)//cur为空时结束循环
{
if(cur->val != val)
{
prev = cur;
cur = cur->next;
}
else
{
struct ListNode* next = cur->next;
free(cur);
cur = next;
prev->next = cur;
}
}
return head;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
上面代码是有错误的,原因是我们只考虑了常规情况,所以在执行程序之后会曝出这样的错误:
系统也自动给出了一个测试用例,这个时候我们第一方应不是想着调试,而是想有这么一个单链表,它有4个节点,且每个节点里的值都是7,而题目中也要求val为7,所以这里我们应该先画出图,然后再一步步考虑。
所以思路是这样的:
这个时候就很简单了,正确的代码是这样的:
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode* prev = NULL;
struct ListNode* cur = head;
while(cur)//cur为空时结束循环
{
if(cur->val != val)
{
prev = cur;
cur = cur->next;
}
else
{
struct ListNode* next = cur->next;
if(prev == NULL)
{
free(cur);
cur = next;
head = next;
}
else
{
free(cur);
cur = next;
prev->next = cur;
}
}
}
return head;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
如果我们实在想不出也看不出错误所在,那么就只能选择调试了,那么该如何进行调试这类题目呢?
好,下面详细跟大家说说关于力扣牛客上面的接口型题目出bug时在自己的编译器上的调试问题:
首先根据程序给出的错误和测试用例创建一个单链表,这里的话就创建有4个节点,每个节点里的值为7,val也为7的单链表,正确的创建方法是这样的(主函数内容):
int main()
{
struct ListNode* node1 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* node2 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* node3 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* node4 = (struct ListNode*)malloc(sizeof(struct ListNode));
node1->val = 7;
node2->val = 7;
node3->val = 7;
node4->val = 7;
node1->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = NULL;
removeElements(node1, 7);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
然后开始调试即可。
完整的代码如下:
//画图分析不出来问题所在,只有一种办法,调试!
#include<stdio.h>
#include<stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode* prev = NULL;
struct ListNode* cur = head;
while (cur)
{
if (cur->val != val)
{
prev = cur;
cur = cur->next;
}
else
{
struct ListNode* next = cur->next;
free(cur);
cur = next;
}
}
return head;
}
int main()
{
struct ListNode* node1 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* node2 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* node3 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* node4 = (struct ListNode*)malloc(sizeof(struct ListNode));
node1->val = 7;
node2->val = 7;
node3->val = 7;
node4->val = 7;
node1->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = NULL;
removeElements(node1, 7);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
文章来源: bit-runout.blog.csdn.net,作者:安然无虞,版权归原作者所有,如需转载,请联系作者。
原文链接:bit-runout.blog.csdn.net/article/details/123578529
- 点赞
- 收藏
- 关注作者
评论(0)