各位csdn的友友们大家好啊,也许我们在编程中被链表的各种习题搞得团团转,其实本质都离不开链表的头插,头删,尾插,尾删,看完这篇文章之后,相信你们一定会对链表有一个重新的认知,下面来一起和阿博走进链表吧
文章目录
一.题目描述二.逻辑分析三.错误分析四.代码纠正
一.题目描述
二.逻辑分析
三.错误分析
四.代码纠正
一·题目描述
二.逻辑分析
方法一(错误案例):
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode*cur=head;
struct ListNode*prev=NULL;
while(cur)
{
if(cur->val!=val)
{
prev=cur;
cur=cur->next;
}
else
{
~~~~~~ prev->next=cur->next;
free(cur);
cur=prev->next;
}
}
return head;
}
三.错误分析
首先友友们我们遇到错误千万不要乱了头脑,一定要仔细走读代码,然后我们还有大招调试,这里它提示我们prev->next=cur->next出了空指针,我们就可以想是不是我们对空指针进行了解引用,然后如果第一个元素的值就等于val的话,我们这个时候就需要进行头删,而此时prev的值还是空指针,我们就把空指针进行了解引用导致了程序报错 图解展示:
四.代码纠正
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode*cur=head;
struct ListNode*prev=NULL;
while(cur)
{
if(cur->val!=val)
{
prev=cur;
cur=cur->next;
}
else
{
if(prev==NULL)
{
cur=cur->next;
free(head);
head=cur;
}
else
{
prev->next=cur->next;
free(cur);
cur=prev->next;
}
}
}
return head;
}
方法二(错误案例):
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode*cur=head;
struct ListNode*tail=NULL;
//struct ListNode*newhead=NULL;
while(cur)
{
if(cur->val!=val)
{
if(tail==NULL)
{
tail=cur;
}
else
{
tail->next=cur;
tail=tail->next;
}
cur=cur->next;
}
else
{
struct ListNode*del=cur;
cur=cur->next;
free(del);
}
}
return head;
}
三.错误分析
原因1:
原因2:
四.代码纠正
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode*cur=head;
struct ListNode*tail=NULL;
struct ListNode*newhead=NULL;
while(cur)
{
if(cur->val!=val)
{
if(tail==NULL)
{
newhead=tail=cur;
}
else
{
tail->next=cur;
tail=tail->next;
}
cur=cur->next;
tail->next=NULL;
}
else
{
struct ListNode*del=cur;
cur=cur->next;
free(del);
}
}
return newhead;
}
一·题目描述
二.逻辑分析
1.next指针在循环里面定义
struct ListNode* reverseList(struct ListNode* head){
struct ListNode*cur=head;
struct ListNode*rhead=NULL;
while(cur)
{
struct ListNode*next=cur->next;
cur->next=rhead;
rhead=cur;
cur=next;
}
return rhead;
}
2.next指针在循环外面定义
错误案例一:
struct ListNode* reverseList(struct ListNode* head){
struct ListNode*cur=head;
if(cur==NULL)
{
return NULL;
}
struct ListNode*rhead=NULL;
struct ListNode*next=cur->next;
while(cur)
{
cur->next=rhead;
rhead=cur;
cur=next;
next=cur->next;
}
return rhead;
}
四.代码纠正
struct ListNode* reverseList(struct ListNode* head){
struct ListNode*cur=head;
if(cur==NULL)
{
return NULL;
}
struct ListNode*rhead=NULL;
struct ListNode*next=cur->next;
while(cur)
{
cur->next=rhead;
rhead=cur;
cur=next;
if(cur)
{
next=cur->next;
}
}
return rhead;
}
好了友友们,本期内容到这里就告一段落了,码字不易,如果友友们感觉对自己有帮助的话,可以给阿博点个免费的关注哦,后续阿博会继续给友友们分享更多干货知识.
好文链接
发表评论