【实用博文】关于力扣牛客上面的接口型题目出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;}
上面代码是有错误的,原因是我们只考虑了常规情况,所以在执行程序之后会曝出这样的错误:
系统也自动给出了一个测试用例,这个时候我们第一方应不是想着调试,而是想有这么一个单链表,它有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;}
如果我们实在想不出也看不出错误所在,那么就只能选择调试了,那么该如何进行调试这类题目呢?
好,下面详细跟大家说说关于力扣牛客上面的接口型题目出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;}
然后开始调试即可。
完整的代码如下:
//画图分析不出来问题所在,只有一种办法,调试!#include#includestruct 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;}