各位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;

}

好了友友们,本期内容到这里就告一段落了,码字不易,如果友友们感觉对自己有帮助的话,可以给阿博点个免费的关注哦,后续阿博会继续给友友们分享更多干货知识.

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: