力扣题---移除链表元素

移除链表元素

目录

题目解析

解题思路

源码



题目解析


先要理解题目,才能解题。题目的大概意思是让我们删除再链表中一个值,也就相当于链表的中间节点的删除操作,如果学过单链表解这道题,是很容易的,只不过要稍微处理极端情况。


解题思路


假设这个链表没有极端情况,我只要求删除 3 这个节点 ,那么我们只是要让 2 这个节点的next指针指向4 就是链表删除操作

当然这是正常情况

还有两种极端情况

 假设链表里的值全是我们要删除的值,那么我们要把链表全部删除,并返回NULL

另一种极端情况是当链表并没有值,那么需要我们开头去判断,并返回NULL


有了思路就可以写代码了

我们先解决一个极端情况,这需要我们开头去判断

若链表为空,那么我们直接返回空就好了

 先定义两个指针,这两个指针来帮我们完成删除操作

 我们先判断链表头是不是我们要删除的值,如果是,那么我们就把链表的头释放,让下一个节点成为链表的头,并且让两个指针向后移动

若在链表的中间遇到需要删的值,那么我们把cur的next指针指向end的next指针,让指针无法找到end当前位置的值,再让end指针向后走

如果两个指针并没有遇到需要删的值,那么我们就让两个指针继续向后走

还有第二种极端情况,就是链表中全部都是需要删除的值,经过循环的删除,肯定是剩下一个节点,那么我们把head置空就可以了,并且返回这个头


源码

struct ListNode* removeElements(struct ListNode* head, int val){
    if(head==NULL)
    {
        return NULL;
    }
   struct ListNode* cur=head;
   struct ListNode* end=cur->next;
   while(end)
   {
       if(head->val==val)
       {
           free(head);
           cur=end;
           head=cur;
           end=end->next;
       }
       else if(end->val==val)
       {
           cur->next=end->next;
           end=cur->next;
       }
       else
        {
            cur=end;
            end=cur->next;
        }
   }
   if(head->next==NULL && head->val==val)
   {
       head=NULL;
   }
   return head;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值