每日一题(移除链表元素)

news2025/1/21 12:51:25

每日一题(移除链表元素)

203. 移除链表元素 - 力扣(LeetCode)

在这里插入图片描述

思路一:

可以创建一个新的链表头节点newhead,只要是原链表中值不为val的节点、都通过尾插操作插到newhead所指向的链表中,原链表中值为val的节点直接删除释放掉。为了让尾插操作更方便,还需要再定义一个tail指针,用于记录newhead链表中的最后一个元素的地址。(所以每次尾插之后tail指针要进行更新)newhead保持不变,永远指向第一个节点。所以共要,创建四个结构体指针:cur、newhead、next、tail。cur指针用于遍历原链表,newhead用于记录新链表的头,最后函数的返回值就用newhead进行返回,next指针用于记录cur指针的下一个位置,方便进行尾插操作,tail指针用于记录newhead链表中的最后一个元素,并且每一次的尾插之后都要进行更新。

思路二:

直接使用cur指针和prev指针遍历原链表,cur指针从原链表的头开始遍历,prev用于记录cur的上一个节点的地址。假如cur指向的节点的值为val,先让prev和cur节点的next连接起来。接着释放cur指向的节点。(但是假如cur一开始指向head时,该节点的值也恰好为val,则此时要进行头删操作,并且释放之后的节点无效了,需要更新head。)

思路一代码:

struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode* cur = head;
    struct ListNode* next = head;
    struct ListNode* newhead = NULL;
    struct ListNode* tail = newhead;
    while(cur)
    {
        //满足删除条件
        if(cur ->val != val)
        {
            //假如newnode是空
            if(newhead== NULL)
            {
                next = cur->next;
                newhead = cur;
                tail = newhead;
                cur = next;
            }
            //newnode不是空
            else
            {
                next = cur->next;
                tail->next = cur;
                tail = tail->next;
                cur = next;
            }
        }
        //不满足删除条件
        else
        {
            next = cur->next;
            free(cur);
            cur = next;
        }
    }
        if(tail!=NULL)
        tail->next = NULL;
        return newhead;
}

思路二代码:

    struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode* prev=NULL;
    struct ListNode* cur = head;
    while(cur)
    {
        //节点的值满足删除条件
        if(cur->val == val)
        {
            //当删除的是头节点
            if(cur == head)
            {
                head = cur->next;
                free(cur);
                cur = head;
            }
            //当删除的不是头节点
            else
            {
                prev->next = cur->next;
                free(cur);
                cur = prev->next;
            }
        }

        //节点的值不满足删除条件
        else//向后走
        {
            prev = cur;
            cur=cur->next;
        }
    }
    return head;
}

注意:以下都是针对思路一的讲解:

图解

在代码的初始状态是如下图所示的:此时的next和cur都指向head,也就是原链表中的第一个元素。newhead和tail为空指针时,要进行特判,记录cur的下一个位置之后,要先让newhead指向cur,同时tail指针也向后移动了一步指向cur,完成了更新。

在这里插入图片描述

当来到下图所示的常规情况时,此时的tail和newhead都不为空,newhead不能动,记录cur的next之后,直接改变tail的next并且更新tail即可。

在这里插入图片描述

当代码进行到如下图所示时,此时cur为空指针,while循环结束,按常理来讲就应该要返回newhead了。(单链表的最后一个节点的next指针的值必须是NULL)但是,此时的的tail的next指针仍然是指向6所在的节点的,并且该节点虽然被释放了,但是值就会变成随机值,并不一定是NULL,所以在返回newhead之前,要将tail的next置为空指针。

在这里插入图片描述

注意:当测试用例使用空链表测试时,cur的值也为NULL,while循环并没有进入。也就说明tail的值一直都是NULL并没有被改变,如果此时仍然使用tail->next = NULL;强行置空就会出现空指针访问错误。所以此处需要进行特判。

完结

本题的全部分析就到这里啦,若有不足,欢迎评论区指正,下期见!

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

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

相关文章

swiper插件使用

swiper插件使用 1.进入官网 官网地址 2.下载文件保存到自己电脑上 3.解压文件夹,找到如图所示的两个文件夹,复制并引入到自己的项目中 4.使用 1.继续打开官网地址,寻找在线演示里面的轮播图案例,挑一个自己需要的,到新窗口打开 2.打开之后,右键,检查网页源代码 3.复制里面…

优秀案例 | 数字人+文化浪漫,开启城市数字文化沉浸式体验

数字人作为城市宣传的新载体、新介质, 可带来多元化、数字化的城市文旅发展模式, 通过打破虚实次元空间, 展现出传统文化与现代生活的相碰撞的魅力。 数字人文化浪漫 赋能城市文化新体验 南京首个以文化元宇宙主题体验中心及高校、文博…

基于JavaWeb和mysql实现网上书城前后端管理系统(源码+数据库+开题报告+论文+答辩技巧+项目功能文档说明+项目运行指导)

一、项目简介 本项目是一套基于JavaWeb和mysql实现网上书城前后端管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、项目文档、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都…

【计算机网络】带你一文搞懂Http和Https的关系和区别!(最强详解!!)

目录 首先来讨论一下Http和Https的背景 基本概念 一、HTTP协议: 二、HTTPS协议: 区别 工作原理 HTTP工作原理 Https工作原理 HTTPS优缺点 优点: 缺点: HTTP请求消息和响应消息 响应消息 进行TLS握手时的通俗的解释&a…

智能安全帽~生命体征检测与危险气体检测一体化集成设计还是蓝牙无线外挂式方式好?

生命体征(心率、血氧等)检测&上报平台,危险气体采集&上报平台,是智能安全帽产品中常见的两种选配件,它们的实现有两种典型的模式: 1)将传感器集成到主板上,做成一体化的智能…

RabbitMQ工作模式-工作队列

官网关于工作模式的解释地址:https://www.rabbitmq.com/getstarted.html Work Queue(工作队列) 生产者发消息,启动多个消费者来消费消息,每个消费者仅消费部分消息,可达到负载均衡的效果。 创建生产者 i…

java错误解决方案百科

一、业务开发缺陷 ① 工期紧、逻辑复杂,开发人员会更多地考虑主流程逻辑的正确实现,忽略非主流程逻辑,或保障、补偿、一致性逻辑的实现; ② 往往缺乏详细的设计、监控和容量规划的闭环,结果就是随着业务发展出现各种各…

NSS [羊城杯 2020]easyser

NSS [羊城杯 2020]easyser 开题。很容易让人觉得环境坏了。 不要慌,无从下手时。看源码、扫目录、抓包。一套操作下来,发现几个可以下手的路由。 /index.php /robots.txt 访问 /star1.php,一说到百度,就猜测是否存在SSRF。 源码中…

【LeetCode-面试经典150题-day18】

目录 17.电话号码的字母组合 77.组合 46.全排列 52.N皇后Ⅱ 17.电话号码的字母组合 题意: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同&#xf…

Python(Web时代)—— Django数据库(多表)

两表联查 常见的两表关系: 一对多:ForeignKey 举例:一个学生对应多个地址 一般通过外键实现 需要在“多”的那个模型中使用ForeignKey 使用on_delete指定级联删除策略: CASCADE:当父表数据删除时,相对…

xml和json互转工具类

分享一个json与xml互转的工具类&#xff0c;非常好用 一、maven依赖 <!-->json 和 xm 互转</!--><dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</version></dependency&g…

网工内推 | 技术支持工程师,最高40k,CCNP、CISP认证优先

01 卓望公司 招聘岗位&#xff1a;高级技术支持工程师 职责描述&#xff1a; 1、负责网络安全防护类产品技术支持工作&#xff0c;包括但不限于&#xff1a;抗DDoS&#xff0c;云WAF&#xff0c;漏洞扫描等。 2、负责网络安全防护类产品安装、配置、升级和系统加固等维护支撑工…

软考知识汇总--操作系统

操作系统 1 操作系统层次结构图 2 进程管理 2.1 程序与进程 2.1.1 顺序执行 PV操作

【业务功能篇90】微服务-springcloud-检索服务-ElasticSearch实战运用-DSL语句

商城检索服务 1.检索页面的搭建 商品检索页面我们放在search服务中处理&#xff0c;首页我们需要在mall-search服务中支持Thymeleaf。添加对应的依赖 <!-- 添加Thymeleaf的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifa…

设计模式行为型-状态模式

文章目录 简介状态模式基础定义状态接口或抽象类实现具体状态类 上下文类与状态转换上下文类的定义和作用状态转换及触发条件 状态模式的优势与适用性优点一&#xff1a;可维护的代码优点二&#xff1a;清晰的状态管理适用场景一&#xff1a;对象拥有多个状态适用场景二&#x…

分享一个非常有趣的纯css杂志封面折叠效果

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;有趣的纯css杂志封面折叠效果 文章目录 效果出处效果HTMLCSS 效果出处 这个css杂志封面折叠效果非常有趣&#xff0c;我就转载加以记录。 效果来源于&#xff1a;码上掘金Mad Magazine 效果 HTML…

硬件系统工程师宝典(38)-----常用接口之视频接口的电路设计

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。 上篇我们介绍了一些常用的接口带EMC保护的电路设计&#xff0c;有AC24V、AC110~220V、AV接口、CAN接口、DC12V、DC24V、DC48V接口。今天我们来讲一…

vulhub之MinIO信息泄露漏洞(CVE-2023-28432)

文章目录 0x01 前言0x02 漏洞描述0x03 影响范围0x04 漏洞复现1.启动环境2.查看端口3.构造POC 0x05 修复建议 0x01 前言 本次测试仅供学习使用&#xff0c;如若非法他用&#xff0c;与本文作者无关&#xff0c;需自行负责&#xff01;&#xff01;&#xff01; 0x02 漏洞描述 …

攻防世界-web-fakebook

1. 题目描述 打开链接&#xff0c;这样一个界面 貌似没啥特殊的。。。没关系&#xff0c;我们每个页面都点击一下 login页面&#xff1a;一个简单的登录页面 join界面&#xff1a;不出意外&#xff0c;这应该是一个注册界面 目前&#xff0c;我们什么都不做&#xff0c;能获…