LeetCode刷题系列之----->(指针玩转链表篇)(一)

各位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;
}
好了友友们,本期内容到这里就告一段落了,码字不易,如果友友们感觉对自己有帮助的话,可以给阿博点个免费的关注哦,后续阿博会继续给友友们分享更多干货知识.🌺🌺🌺
  • 36
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 58
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 58
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿博历练记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值