【刷题之路】LeetCode 203. 移除链表元素

news2024/9/20 18:45:27

【刷题之路】LeetCode 203. 移除链表元素

  • 一、题目描述
  • 二、解题
    • 1、方法1——在原链表上动刀子
      • 1.1、思路分析
      • 1.2、代码实现
    • 2、方法2——使用额外的链表
      • 2.1、思路分析
      • 2.2、代码实现

一、题目描述

原题连接: 203. 移除链表元素

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

示例 1:

在这里插入图片描述
输入: head = [1,2,6,3,4,5,6], val = 6
输出: [1,2,3,4,5]

示例 2:

输入: head = [], val = 1
输出: []

示例 3:

输入: head = [7,7,7,7], val = 7
输出: []

提示:
列表中的节点数目在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50

二、解题

1、方法1——在原链表上动刀子

1.1、思路分析

首先我们应该能想到的就是使用一个cur指针来遍历链表,当cur-val == val时就删除cur:
在这里插入图片描述

但是这是单链表,也就意味着如果我们直接删除掉cur的话,就找不到cur后面的节点了,所以正确的做法应该是在删除之前先使用一个pre指针保存好cur的前一个节点,删除之前先让pre的next指向cur的next,然后再删除cur:
在这里插入图片描述
然后再使cur = pre->next即可。
不过有一个特殊情况就是当第一个节点的val刚好等于待删除的val时,例如:
在这里插入图片描述
这时候的cur就没有前驱节点pre了,所以这时候就应该直接执行头删。
而当我们要删除的节点刚好是链表的最后一个节点的时候,这种情况其实并不用特殊处理,因为当我们向上面一样执行完删除操作时,cur就已经为NULL了pre就已经是最后一个节点了:
在这里插入图片描述

1.2、代码实现

有了以上思路,那我们写起代码来也就水到渠成了:

struct ListNode* removeElements(struct ListNode* head, int val){
    if (NULL == head) {
        return NULL;
    }
    struct ListNode *cur = head;
    struct ListNode *pre = NULL; 
    while (cur) {
        if (val == cur->val) {
            if (cur == head) { // 头删
                head = cur->next;
                free(cur);
                cur = head;
            } else {
                pre->next = cur->next;
                free(cur);
                cur = pre->next;
            }
        } else { // 迭代地往后走
            pre = cur;
            cur = cur->next;
        }
    }
    return head;  
}

时间复杂度;O(n),n为链表的长度。
空间复杂度:O(1),我们只需要用到常数级的额外空间。

2、方法2——使用额外的链表

2.1、思路分析

我们可以创建一个新的链表,用一个新的头指针newhead指向。使用一个cur指针来遍历原链表,当cur的val不等于待删除的val时候,就将cur尾插到新链表中,当cur的val等于待删除的val时就删除cur:
在这里插入图片描述
同样的,为了保证删除节点后还能找到下一个节点,我们需要提前使用一个next指针保存cur的下一个节点:
在这里插入图片描述
而且插入新链表执行的是尾插,为了不必每次都找尾,我们需要在使用一个指针tail来保存新节点的尾节点:

在这里插入图片描述
然后每次的尾插我们就只需要执行tail->next = cur,然后执行tail = tail->next即可。
还有一个特殊情况那就只剩头插了,因为是插入第一个节点,所以此时的tail就为NULL,所以不能直接使用tail,这时候应该直接执行头插,即newhead = cur,然后再让tail = cur即可:
在这里插入图片描述

2.2、代码实现

有了以上思路,那我们写起代码来也就水到渠成了:

struct ListNode* removeElements(struct ListNode* head, int val){
    if (NULL == head) {
        return NULL;
    }
    struct ListNode *cur = head;
    struct ListNode *newhead = NULL; // 新链表的头指针
    struct ListNode *Next = NULL; // 当cur->val == val时,保存cur的下一个节点,以辅助释放cur
    struct ListNode *tail = NULL; // 保存新链表的最后一个节点
    while (cur) {
        if (cur->val == val) {
            Next = cur->next;
            free(cur);
            cur = Next;
        } else {
            if (NULL == newhead) {
                newhead = cur;
                tail = cur;
            } else {
                tail->next = cur;
                tail = tail->next;
            }
            cur = cur->next;
            tail->next = NULL;
        }
    }
    return newhead;
}

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

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

相关文章

跨数据中心下的 Kafka 高可用架构分析

导语 本文介绍了 Kafka 跨数据中心的两种部署方式&#xff0c;简要分析两种方式下的不同架构以及优缺点&#xff0c;对这些架构可能碰到的问题也提供了一些解决思路&#xff1b;同时也说明了 Kafka 跨数据中心部署的社区解决方案和商业化解决方案。 背景 Kafka 作为世界上最…

laravel5.6.* + vue2 创建后台

本地已经安装好了composer 1.新建 Laravel5.6.*项目 composer create-project --prefer-dist laravel/laravel laravel5vue2demo 5.6.* 2. cd laravel5vue2demo 3. npm install /routes/web.php 路由文件中, 修改 Route::get(/, function () {return view(index); });新建…

第三方jar包引入项目,发布到本地和远程仓库

在开发过程中&#xff0c;往往会遇到对接其他公司的系统。然后对接公司会提供API对接方式&#xff0c;就是给一个jar包。我们只需要把jar包引入到项目中直接用即可。本地引用jar的话可以有两种方式。第一种就是本地包引用&#xff0c;如下将包放下工程下&#xff0c;然后maven指…

【五一劳动节来了】

今年“五一”&#xff0c;4月29日至5月3日放假调休&#xff0c;共5天。 如果你在5月4日到5月6日请假3天&#xff0c;加上5月7日周日&#xff0c;就可以形成9天的假期。 一&#xff0c;五一劳动节的由来⭐ 国际劳动节又称“五一国际劳动节”“国际示威游行日”&#xff08;英语…

抢先看,甘特图工具DHTMLX gantt 灯箱编辑器通过套件 UI 小部件进行了扩展

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求&#xff0c;具备完善的甘特图图表库&#xff0c;功能强大&#xff0c;价格便宜&#xff0c;提供丰富而灵活的JavaScript API接口&#xff0c;与各种服务器端技术&am…

【STL十四】函数对象(function object)_仿函数(functor)——lambda表达式

【STL十四】函数对象&#xff08;function object&#xff09;_仿函数&#xff08;functor&#xff09;——lambda表达式 一、函数对象&#xff08;function object&#xff09;二、函数对象优点三、分类四、头文件五、用户定义函数对象demo六、std::内建函数对象1、 算术运算函…

YARN 远程代码执行(RCE)安全漏洞问题分析与解决方案

YARN 远程代码执行&#xff08;RCE&#xff09;安全漏洞问题分析与解决方案 1 YARN RCE 漏洞问题问题现象 某客户使用Tenable.sc扫描安全漏洞后反馈&#xff0c;YARN 存在Remote code execution (RCE) 安全漏洞问题&#xff0c;攻击者可在未经过身份验证的情况下通过该漏洞在…

【21】核心易中期刊推荐——人工智能 | 遥感图像识别

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

psql在建表时,分为常规、外部、分区,三者有什么区别?如何从建表语句中区分?

在 PostgreSQL 中&#xff0c;常规表、外部表和分区表都可以通过 CREATE TABLE 语句进行创建&#xff0c;它们的创建语法略有不同&#xff0c;通过创建语句可以很明显地区分它们的类型。 以下是常规表、外部表和分区表的创建语法及示例&#xff1a; 1. 常规表 常规表是最常见…

Spring核心与设计思想、创建与使用

文章目录 一、Spring是什么二、为什么要学习框架三、IoC和DI&#xff08;一&#xff09;IoC1. 认识IoC2. Spring的核心功能 &#xff08;二&#xff09;DI 四、Spring项目的创建&#xff08;一&#xff09;使用 Maven 方式创建一个 Spring 项目 五、Spring项目的使用&#xff0…

少年与阿童木:一场软件竞技赛背后的智能未来

1961年&#xff0c;手冢治虫创办了虫制作株式会社&#xff0c;带领团队开始尝试将此前的漫画作品进行动画化。1963年的元旦&#xff0c;他们的首部作品一经播出就引发轰动&#xff0c;这部动画的名字叫做——《铁臂阿童木》。 一晃数十年&#xff0c;阿童木已经成为了几代人对A…

2023年6月DAMA-CDGA/CDGP数据治理工程师认证报名及费用

目前6月DAMA-CDGA/CDGP数据治理认证考试开放报名地区有&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特。目前南京、济南、西安、杭州等地区还在接近开考人数中&#xff0c;打算6月考试的朋友们可以抓紧时间报名啦&#xff01;&#xff01;&#xff01; 5月初&#xff0c;…

大数据 | 实验二:文档倒排索引算法实现

文章目录 &#x1f4da;实验目的&#x1f4da;实验平台&#x1f4da;实验内容&#x1f407;在本地编写程序和调试&#x1f955;代码框架思路&#x1f955;代码实现 &#x1f407;在集群上提交作业并执行&#x1f955;在集群上提交作业并执行&#xff0c;同本地执行相比即需修改…

蓝牙耳机怎么挑选?鹏鹏数码盘点2023口碑蓝牙耳机排行榜

大家好&#xff0c;欢迎来到鹏鹏数码频道。 上次测评发布后网友们评论不知道蓝牙耳机怎么挑选&#xff0c;为此我购入了市面上主流品牌的蓝牙耳机共计三十款&#xff0c; 经过两周的地狱式测评&#xff0c;总结了口碑蓝牙耳机排行榜&#xff0c;看看表现最好的是哪几款蓝牙耳机…

Linux操作系统命令大全

Linux是一种操作系统 Operating System 简称 OS &#xff0c;是软件的一部分&#xff0c;它是硬件基础上的第一层软件&#xff0c;是硬件和其它软件沟通的桥梁。 操作系统会控制其他程序运行&#xff0c;管理系统资源&#xff0c;提供最基本的计算功能&#xff0c;如管理及配置…

SSM整合(一) | SSM创建项目配置整合 - 添加功能模块

文章目录 SSM整合SSM配置整合SSM功能模块 SSM整合 SSM配置整合 SSM整合流程: 创建工程SSM整合 Spring SpringConfig MyBatis MybatisConfigJdbcConfigjdbc.properties SpringMVC ServletConfigSpringMvcConfig 创建工程 基于Maven创建项目, 选择webapp模版并补全缺失的目录 …

最优化方法Python计算:一元函数导数的数值计算

定义1 给定连续函数 f ( x ) f(x) f(x)&#xff0c; x ∈ Ω ⊆ R x\in\Omega\subseteq\text{ℝ} x∈Ω⊆R。设 x , x 1 ∈ Ω x,x_1\in\Omega x,x1​∈Ω&#xff0c; Δ x x − x 1 \Delta xx-x_1 Δxx−x1​ 称为变量 x x x的差分。此时&#xff0c; x x 1 Δ x xx_1\De…

黑盒测试过程中【测试方法】详解5-输入域,输出域,猜错法

在黑盒测试过程中&#xff0c;有9种常用的方法&#xff1a;1.等价类划分 2.边界值分析 3.判定表法 4.正交实验法 5.流程图分析 6.因果图法 7.输入域覆盖法 8.输出域覆盖法 9.猜错法 黑盒测试过程中【测试方法】讲解1-等价类&#xff0c;边界值&#xff0c;判定表_朝一…

Linux下实现共享内存的两种机制(附源码)

START Hello 大家好。 今天来讲一下Linux进程通信中重要的通信方式&#xff1a;共享内存作为Linux软件开发攻城狮&#xff0c;进程间通信是必须熟练掌握的重要技能&#xff0c;而共享内存是在程序开发中常用的也是重要的一种进程间通信方式。 下面我们就来聊一聊Linux下进程间…

【C++】string类的深浅拷贝问题

string类的深浅拷贝问题 浅拷贝问题构造/析构函数拷贝构造/赋值运算符重载的多种写法 浅拷贝问题 我们知道&#xff0c;定义一个类的时候&#xff0c;如果我们没有写构造&#xff0c;拷贝构造&#xff0c;赋值运算符重载&#xff0c;析构方法的话&#xff0c;编译器会自动生成。…