移除链表元素

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

一.链表必会题 - - 力扣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;
}

但是仅仅这样是行不通的,当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;
}

在这里插入图片描述

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;
}

在这里插入图片描述

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

结尾

结尾

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

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

  • 36
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 40
    评论
以下是移除链表元素的Python代码: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def removeElements(head: ListNode, val: int) -> ListNode: # 处理头部节点为要删除元素的情况 while head is not None and head.val == val: head = head.next # 处理链表中间节点为要删除元素的情况 if head is not None: node = head while node.next is not None: if node.next.val == val: node.next = node.next.next else: node = node.next return head ``` 这里定义了一个ListNode类表示链表节点,其中val表示节点的值,next表示指向下一个节点的指针。removeElements函数的第一个参数head表示链表的头节点,第二个参数val表示要删除的元素值。函数的返回值是移除后的链表头节点。 函数的实现分为两步: 1. 处理头部节点为要删除元素的情况,即如果头部节点的值等于要删除的元素值,则将头部节点指向下一个节点,直到头部节点的值不等于要删除的元素值。 2. 处理链表中间节点为要删除元素的情况,即从头节点开始遍历链表,如果当前节点的下一个节点的值等于要删除的元素值,则将当前节点的next指针指向下一个节点的next指针,即跳过当前节点的下一个节点;否则,将当前节点指向下一个节点。遍历完成后,返回链表的头节点。 注意,这里的实现并没有考虑链表为空的情况,需要在调用函数前进行判断。
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值