单链表OJ题:移除链表元素(力扣)

news2024/10/26 12:18:00

目录

解法一:带头节点的新链表

解法二:不带头节点的新指向关系链表

总结


这是一道简单的力扣题目,关于解法的话,这里提供了二种思路,重点解释前两种还有一种思路好想,但是时间复杂度为O(n^2) ,提供的这两种时间复杂度为O(n),所以,我们以解题的代码量少,时间最优选择提供的这两种的解法

解法一:带头节点的新链表

这里只所以要带头节点,是因为带头节点可以给我们的解题上带来一些方便,在总结里面我们会重点比较带头节点和不带头节点解题上的区别

带头节点时,我们需要申请一个头节点,头节点的作用是用来占位(最后我们需要返回的是头节点的下一个节点地址),然后,我们遍历原链表,将原链表中节点的val值不为6的节点依次尾插在头节点的后面,最后,将最后的节点的next域置为NULL,我们得到一个新链表,返回头节点的下一个节点的地址,就是我们的答案。 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {
    ListNode* newNodeHead = (ListNode*)malloc(sizeof(ListNode));  //创建新链表的头节点
    newNodeHead->val = 0, newNodeHead->next = NULL;
    ListNode* newHead,*newTail;
    newHeadHead = newTail = newNode;     //初始化头指针和尾指针指向新链表的第一个节点
    //遍历原链表
    while(head){
        if(head->val != val){
            newTail->next = head;       //找到符合的值就插入到新链表的后面
            newTail = newTail->next;     //尾指针后移
        }
        head = head->next;      //不断后移指针
    } 
    newTail->next = NULL;
    return newHeadHead->next;
}

我们举个例子,一开始,我们申请一头节点头节点的next域为NULL,我们要遍历原链表,将原链表中val值不为6的节点连接在newNodeHead后面 

修改完之后,节点的关系如图所示,原链表的节点指向被改变,尾节点的next域为NULL

这里需要注意:

1、尾指针始终要指向头节点后面要尾插的节点,也就是指向新链表的最后一个节点,当原链表查找结束的时候,要把尾指针的next置为NULL。一方面,防止当新链表中的最后一个节点是原链表的中间节点的时候,尾节点的next域不为NULL便会访问原链表中的这个中间节点后面的节点,也就会访问到其中的节点中不满足val条件的节点,另一方面,当第一个节点为NULL时,我们需要返回的是头节点的next域,所以这时要把该指针置为NULL) 

2、返回的是头节点的next指针,也就是头节点的下一个节点。

解法二:不带头节点的新指向关系链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
typedef struct ListNode  ListNode;
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        if(head==NULL){
            return NULL;
        }
        ListNode * newHead,*newTail;   //创建新的链表
        newHead = newTail = NULL;
        //遍历链表
        ListNode * pcur = head;   //创建指向头节点的指针,便于遍历
        while(pcur){
            if(pcur->val != val){
                //找值不为val的节点,将这个节点添加到新链表中
                if(newHead == NULL){
                    newHead = newTail = pcur;
                }else{
                    newTail->next = pcur;
                    newTail = newTail->next;    //尾指针向后移动
                }
            }
            pcur = pcur->next;    //pucr 往后遍历
        }
        if(newTail != NULL){
            newTail->next = NULL;
        }
        return newHead;
    }
};

从这里,可以看出,我们不带头节点的解法代码量增加了许多,总体思路分为下面的几步:

1、我们创建头指针指向新链表的第一个节点和尾指针指向新链表的最后一个节点

2、我们遍历原链表,查找节点值不为val的节点,然后,我们把节点尾插到新链表中。

3、插入的时候分两种情况,一种是头指针为NULL,此时要将头指针和尾指针都指向这个节点当新链表的第一个节点

4、当头指针不为NULL时要把节点插入到尾指针指向节点的后面 

5、原链表查找结束后,将尾节点的next域置为NULL.(注意,此时的尾指针可能没有指向原链表的节点,也就是此时newTail尾NULL,这时我们不需要将尾节点的next域置为NULL,不然会报错)

总结

这里,因为解法一有头节点的存在,我们在实现尾插的时候,就不需要考虑插入第一个节点时头指针和尾指针指向的两种情况,直接在头节点后面插入满足条件的节点就行。第二个方便的地方就是,我们在查找完成后,对尾指针指向的节点置为NULL的时候当有头节点的时候,尾指针可以直接置为NULL,因为此次的尾指针指向的是头节点,但是,当尾指针指向的节点不存在的时候,这个时候就不能执行将newTail置为NULL的操作了

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

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

相关文章

使用Prometheus对微服务性能自定义指标监控

背景 随着云计算和容器化技术的不断发展,微服务架构逐渐成为现代软件开发的主流趋势。微服务架构将大型应用程序拆分成多个小型、独立的服务,每个服务都可以独立开发、部署和扩展。这种架构模式提高了系统的可伸缩性、灵活性和可靠性,但同时…

Java.9--集合

一、Collection接口 -->单列集合(共享给大家) .add();把给定的对象添加到当前集合中 clear();清空集合中所有的元素 remove();把给定的对象在当前集合中删除 contains();判断当前集合中是否包含给定的对象 isEmpty();判断当前集合是否为空 siz…

SQL注入之sqlilabs靶场21-30题

重点插入:html表 第二十一题 分析过程:(没有正确的账号密码是否能拿到Cookie?最后注释好像只能使用#,--好像无法注释) 查看源码 这里输入账号密码处被过滤了 但Cookie被base64编码了 可以从Cookie入手 …

智联招聘×Milvus:向量召回技术提升招聘匹配效率

01. 业务背景 在智联招聘平台,求职者和招聘者之间的高效匹配至关重要。招聘者可以发布职位寻找合适的人才,求职者则通过上传简历寻找合适的工作。在这种复杂的场景中,我们的核心目标是为双方提供精准的匹配结果。在搜索推荐场景下&#xff0c…

Ollama+Open WebUI,windows部署一个本地AI

在Ollama官网下载,点击DownLoad 下载完之后进行安装,配置环境变量,完成后打开CMD命令行工具测试 运行并下载模型 之后选择Open WebUI作为图形化界面 🚀 Getting Started | Open WebUI 运行Docker命令 docker run -d -p 3000:80…

【Sublime Text】设置中文 最新最详细

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。 【Sublime Text】设置中文 最新最详细 开…

万字图文实战:从0到1构建 UniApp + Vue3 + TypeScript 移动端跨平台开源脚手架

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🍃 vue-uniapp-template 🌺 仓库主页: Gitee 💫 Github &#x1f…

团结引擎内置 AI 助手团结 Muse Chat 测试版上线!新功能怎么用?能做什么?

在开发过程中,快速获得精准的技术支持能够有效提高开发效率。生成式 AI 的出现为实现实时技术支持提供了新的机会。Unity 中国积极探索 AI 在开发中的应用,并在团结引擎 1.3.0 版本中上线了新功能:团结 Muse Chat。 团结 Muse Chat 是 Unity…

【linux】服务器Ubuntu20.04安装cuda11.8教程

【linux】服务器Ubuntu20.04安装cuda11.8教程 文章目录 【linux】服务器Ubuntu20.04安装cuda11.8教程到官网找到对应版本下载链接终端操作cudnn安装到官网下载下载后解压进入解压后的目录:将头文件复制到 /usr/local/cuda/include/ 目录:将库文件复制到 …

Matlab学习02-matlab中的数据显示格式及符号变量

目录 一,关系运算和逻辑运算 二,变量 三,数据显示格式 四,符号运算 1,创建符号变量 2,数值矩阵转换成符号矩阵 一,关系运算和逻辑运算 在matlab中,只要数值不是 &#xff0…

Lucas带你手撕机器学习——岭回归

岭回归(Ridge Regression) 一、背景与引入 在进行线性回归分析时,我们常常面临多重共线性的问题。多重共线性指的是自变量之间高度相关,这会导致回归系数的不稳定性,使得模型的预测能力降低。传统的线性回归通过最小…

【R + Python】iNaturalist 网站图片下载 inat api

文章目录 一、iNaturalist 简介二、R语言API:rinat三、示例3.1 获取观测数据3.2 绘制可视化图像函数用法 3.4 在区域网格中搜索3.5 下载图片3.51 提取图片 url3.52 下载图片: R语言3.53 下载图片: python 四、获取详细rinat包的文档 一、iNaturalist 简介 &#x1…

微服务网关Zuul

一、Zuul简介 Zuul是Netflix开源的微服务网关,包含对请求的路由和过滤两个主要功能。 1)路由功能:负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。 2)过滤功能:负责对请求的过程…

ReactOS系统中搜索给定长度的空间地址区间中的二叉树

搜索给定长度的空间地址区间 //搜索给定长度的空间地址区间 MmFindGap MmFindGapTopDown PVOID NTAPI MmFindGap(PMADDRESS_SPACE AddressSpace,ULONG_PTR Length,ULONG_PTR Granularity,BOOLEAN TopDown );PMADDRESS_SPACE AddressSpace,//该进程用户空间 ULONG_PTR Length,…

spring整合使用xml方式整合Druid数据源连接池

1.普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。需要数据库连接的时候,就向数据库要求 一个,执行完成后再断…

2024 年 MathorCup妈杯A题台风的分类与预测论文首发+代码分享

基于多模型方法的台风分类、路径预测及登陆后降水影响分析 摘要 台风作为全球最严重的自然灾害之一,具有极大的破坏性和复杂性,其预测和分类具有重要意义。本文基于历史台风数据,针对台风的特征分类、路径预测以及登陆后的降水量和风速变化…

linux网络编程5——Posix API和网络协议栈,使用TCP实现P2P通信

文章目录 Posix API和网络协议栈,使用TCP实现P2P通信1. socket()2. bind()3. listen()4. connect()5. accept()6. read()/write(), recv()/send()7. 内核tcp数据传输7.1 TCP流量控制7.2 TCP拥塞控制——慢启动/拥塞避免/快速恢复/快速重传 8. shutdown()9. close()9…

Jvm中的堆和栈

JVM中的堆和栈分别存放不同的数据类型和内容。 ‌栈(Stack)‌: 存储基本数据类型(如int, char, boolean等)和对象的引用。存储局部变量、方法调用、程序运行状态、方法返回值等。每个线程都有一个独立的线程栈&#…

【 IC每日一题】

IC每日一题 1 八股题:低功耗设计方法1.1 功耗类型1.1.1 动态功耗1.1.2 静态功耗 1.2 SoC低功耗设计方法1.2.1 基于时钟clock的低功耗设计1.2.2 基于电压域voltage的低功耗设计1.2.3 多阈值库1.2.4 RTL低功耗设计 2 手撕题:序列检测2.1 移位寄存器写法2.2…

ClickHouse 3节点集群安装

ClickHouse 简介 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 官方网站:https://clickhouse.com/ 项目地址:https://github.com/ClickHouse/ClickHouse 横向扩展集群介绍 此示例架构旨在提供可扩展性。它包括三个节点&#xff…