深圳幻海软件技术有限公司 欢迎您!

移除链表元素

2023-05-23

☃️个人主页:fighting小泽🌸作者简介:目前正在学习C语言和数据结构🌼博客专栏:leetcode练习题🏵️欢迎关注:评论👊🏻点赞👍🏻留言💪🏻文章目录一.链表必会题--力扣203移除链表元素1.普通方法2.带哨兵位的链表结尾结尾一.链表必会题--力扣203移除链表元素题目链接:

☃️个人主页:fighting小泽
🌸作者简介:目前正在学习C语言和数据结构
🌼博客专栏:leetcode练习题
🏵️欢迎关注:评论👊🏻点赞👍🏻留言💪🏻

文章目录

  • 一.链表必会题 - - 力扣203移除链表元素
    • 1.普通方法
    • 2.带哨兵位的链表
  • 结尾
  • 结尾

一.链表必会题 - - 力扣203移除链表元素

题目链接:移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点并返回 新的头节点

1.普通方法

首先我们能想到的就是遍历一遍链表,将不等于val的节点通过尾插的方式连接起来,将等于val的结点释放掉

测试代码:


struct ListNode* removeElements(struct ListNode* head, int val){
      struct ListNode* fast=head;
      struct ListNode* slow=NULL;

      while(fast)
      {
          if(fast->val == val)
          {              
               slow->next=fast->next;
               free(fast);
               fast=slow->next;  
          }
          else
          {
              slow=fast;
              fast=fast->next;
          }
      }
    return head;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

但是仅仅这样是行不通的,当val在头节点的位置时,我们这样是无法释放头节点的。所以我们要判断头节点是不是等于val,若等于,我们就将头节点指向它的下一个结点,并释放掉当前节点。要是节点元素一直等于val,我们就将头节点一直向后挪,直到指向NULL。

正确代码如下:

struct ListNode* removeElements(struct ListNode* head, int val){
      struct ListNode* fast=head;
      struct ListNode* slow=NULL;

      while(fast)
      {
          if(fast->val == val)
          {
              if(slow)
              {
                  slow->next=fast->next;
                  free(fast);
                  fast=slow->next;
              }
              else
              { 在这里判断头节点,释放并挪动头节点的位置
                fast=fast->next;
                free(head);
                head=fast;
              }
          }
          else
          {
              slow=fast;
              fast=fast->next;
          }
      }
    return head;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

2.带哨兵位的链表

所谓带哨兵位的链表,就是一个附加的链表的节点,该节点作为第一个节点,它的值域并不存储任何东西,只是为了操作的方便引用的。

有了哨兵位作为链表的头节点,我们就不需要不断改变头节点的位置了,只需要将节点值不等于val的节点不断尾插到哨兵位后面就可以了,听着是不是非常简单呢。

代码如下:

struct ListNode* removeElements(struct ListNode* head, int val){
      struct ListNode* cur=head;
      struct ListNode* rhead=(struct ListNode*)malloc(sizeof(struct ListNode));
      struct ListNode* p=rhead;
      while(cur!=NULL)
      {
          if(cur->val != val)
          {
              p->next=cur;
              p=p->next;
          }
         cur=cur->next;
      }
      p->next=NULL;
      return rhead->next;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

注意:哨兵位的下一个节点才是我们的头节点,并且要将最后一个节点的指针置空,它指向的可能是我们刚刚释放掉的空间

结尾

结尾

这些就是我给大家分享的关于移除链表元素的知识啦,希望我们都能有所收获
先赞后看,养成习惯!!^ _ ^
码字不易,大家的支持就是我坚持下去的动力,点赞后不要忘了关注我哦!

如有错误,还请您批评改正(。ì _ í。)

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览46879 人正在系统学习中