移除链表元素

news2024/12/24 8:28:26

☃️个人主页: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;
}

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

在这里插入图片描述

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

结尾

结尾

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/472906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT 和 Elasticsearch:OpenAI 遇见私有数据(二)

在之前的文章 “ChatGPT 和 Elasticsearch:OpenAI 遇见私有数据(二)” 中,我们详细描述了如何结合 ChatGPT 及 Elasticsearch 来进行搜索。它使用了如下的架构: 在今天的文章中,我们来详细描述实现这个的详…

BatchNormalization 介绍

1 为何要用BatchNormalization 为了让深层网络更容易训练,有两种方法: 使用更好的优化器:如 SDGMomentun等; 改变网络结构,比如加入BN层,处理网络数据,让网络数据服从标准的高斯分布&#xff0…

人群计数传统方法:object detection, regression-based

数据标注方式: (1)人很少、人很大的时候用bounding box,把人从头到脚都框进长方形方框内,这个方框只用记录三个点的坐标,左下、左上、右下;测试集预测的时候,除了点的坐标还要输出这…

1. 安装Open vSwitch环境

1. 安装Open vSwitch环境 1 配置基础环境。 在VMware Workstation软件中创建一个虚拟机VM1,配置2张网卡,虚拟机VM1配置如图4-3所示。将网卡ens33地址配置为192.168.1.131/24,网卡ens34地址配置为192.168.2.131/24。 图4-3 VM1虚拟机配置 2…

(有假币,因子个数)笔试强训

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE初阶 目录 文章目录 一、选择1 二、选择2 二、[编程题]有假币 三、[编程题]因子个数 一、选择1 在使用锁保证线程安全时,可能会出现活跃度失败的情况,活跃度失败主要…

【DataGrip】手把手教你使用可视化数据库管理工具DataGrip(附数据库驱动无法下载解决办法)

博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。博主主页: 是瑶瑶子啦所属专栏: Mysql从入门到精通近期目标:写好专栏的每一篇文章 目录 一、…

Android 面试笔记总结,建议吸收一下灵气~

android消息机制 消息机制指Handler、Looper、MessageQueue、Message之间如何工作的。 handler是用来处理消息和接收消息的中间者,handler的创建会伴随着handler中产生looper和MessageQueue,handler依赖于looper,looper依赖于MessageQueue&a…

大学生体质测试管理系统~java

摘要 大学生体质测试管理系统提供给用户一个简单方便体质测试管理信息,通过留言区互动更方便。本系统采用了B/S体系的结构,使用了java技术以及MYSQL作为后台数据库进行开发。系统主要分为系统管理员、教师和用户三个部分,系统管理员主要功能…

[论文笔记]C^3F,MCNN:图片人群计数模型

(万能代码)CommissarMa/Crowd_counting_from_scratch 代码:https://github.com/CommissarMa/Crowd_counting_from_scratch (万能代码)C^3 Framework开源人群计数框架 科普中文博文:https://zhuanlan.zhihu.com/p/65650998 框架网址:https…

[oeasy]python0141_自制模块_module_reusability_复用性

自制包内容 回忆上次内容 上次导入了外部的py文件 import my_module 导入一个自己定义的模块 可以使用my_module中的变量 不能 直接使用 my_module.py文件中的变量只要加my_module.作为前缀就可以 直接导入导入变量、函数 from my_module import pi 可以导入my_module.pi 并…

面试必问的Java 线程池原理及最佳实践

1. 概述 1.1 线程池是什么 线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。 创建线程本身开销大,反复创建并销毁,过多的占用内存。所以有大量线程创建考虑使用…

【Python_Opencv图像处理框架】直方图与傅里叶变换

写在前面 本篇文章是opencv学习的第五篇文章,主要讲解了直方图与傅里叶变换的有关操作,作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正🥰 写在中间 一、直方图 ( 1 &…

软件企业利用ChatGPT的正确姿势

先来看一下现在市场环境 ChatGPT作为现象级产品横空出世之后,极大地带动了大语言模型产业和生成式AI(AIGC)产业的蓬勃发展。海外市场上,OpenAI、微软、谷歌、Meta等巨头动作频频。中国市场更是风起云涌,百度、阿里、华…

Android 源码解读-应用是如何启动的

作者:Android帅次 前言 作为多年的 Android 开发,写了不少应用,但是一个App到底是怎么启动起来的?你要说桌面点一下就启动了,那也对。但是它的启动过程呢?带着这样的疑问,咱们来一步步学习。 …

C语言 | 约瑟夫问题(猴王争夺战)

约瑟夫问题(单向循环链表的使用) 约瑟夫问题有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。下面我们将用猴子争大王这一故事以及采用单向循环链表这一方法来进行讲…

Lazysysadmin靶机渗透过程

准备工作 下载好靶机到本地后 VMware导入OVA 启动靶机 扫描信息 首先扫描整个C段发现主机 进一步扫描端口 从扫描结果可知: Samba服务MySQLSSH端口网站端口 先对网站进行目录遍历 发现有wordpress网站和phpmyadmin管理系统 出现了非常多遍My name is togie.可能…

Leetcode171. Excel 表列序号

Every day a leetcode 题目来源:171. Excel 表列序号 解法1:数学 168. Excel表列名称的逆向题目。 本题实质上是特殊的 26 进制。 A ~ Z对应1 ~ 26。 假设 A 0,B 1,…,那么 AB 261 * 0 260 * 1。 而这里是A…

二叉搜索树中的搜索

1题目 给定二叉搜索树(BST)的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。 示例 1: 输入:root [4,2,7,1,3], val 2 输出&#xff1…

[计算机图形学]材质与外观(前瞻预习/复习回顾)

一、图形学中的材质 不同的物体表面有着不同的材质,而不同的材质意味着它们与光线的作用不同。那么我们之前在介绍辐射度量学和渲染方程提到过其中一个函数,叫做BRDF,而在实际上,也就是BRDF定义了不同的材质。BRDF决定了光如何被反…

JavaScript经典教程(七)-- JavaScript基础 -- 函数、argument、匿名函数、函数深入、选项卡

188:JavaScript基础 - 函数、argument、匿名函数、函数深入、选项卡 1、函数 (1)特性 1、每个函数都有自己的作用域。 2、如果执行该变量名,会返回自己,即返回函数本身。 3、正常调用,返回函数中的执…