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

news2024/11/29 8:49:06

目录

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

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

总结


这是一道简单的力扣题目,关于解法的话,这里提供了二种思路,重点解释前两种还有一种思路好想,但是时间复杂度为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/2227293.html

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

相关文章

qt QGridLayout详解

QGridLayout 是 Qt 框架中的一个布局管理器,用于在网格中排列控件。它允许开发者以行和列的形式组织控件,灵活地管理控件的大小和位置。 重要方法 QGridLayout(QWidget *parent nullptr):创建一个 QGridLayout对象,并指定其父窗…

R语言笔记(四):函数

文章目录 一、Function basics1、Creating your own function2、Function structure3、Using your created function4、Multiple inputs5、Default inputs 二、Return values and side effects1、Returning more than one thing2、Side effectsExample of side effect: plot 三…

基于熵权法的TOPSIS模型

基于熵权法的TOPSIS模型 1. 简介 数学建模可以结合 熵权法 和 T O P S I S TOPSIS TOPSIS 法各自的特点,进行评价,这种组合模型的使用在数学建模比赛中使用的非常多。 在 2023 美赛 O 奖中就有使用该方法的,往年国赛国奖中也有 2. 熵权法介…

Chromium HTML5 新的 Input 类型tel对应c++

一、Input 类型: tel <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>test</title> </head> <body><form action"demo-form.php">电话号码: <input type"tel" name…

Cesium基础-(Entity)-(point)

** 里边包含Vue、React框架代码 ** 1、point 点 效果&#xff1a; Cesium中点(Point)的详细解读如下&#xff1a; Entity API简介&#xff1a; Cesium提供了Entity API&#xff0c;它是一个高级别的数据驱动的API&#xff0c;用于管理一组相关性的可视化对象。Entity API使…

宠物空气净化器有哪些功能呢?优品宠物空气净化器使用体验分享

前段时间&#xff0c;我朋友家生二胎了&#xff0c;为了家里的宝宝&#xff0c;准备入手一台空气净化器。跑来问我&#xff0c;让我推荐一款能净化空气的空气净化器。让他描述描述需求&#xff0c;才知道&#xff0c;他家除了新添了二胎外&#xff0c;最近还养了一只猫&#xf…

学习私服并配置到项目中

下载地址 一、安装 1.将下载好的压缩包进行解压 2.进人bin目录下cmd&#xff0c;执行 nexus.exe /run nexus3.访问nexus界面 在浏览器中输入&#xff1a;http://localhost:8081 4.登录 Username为admin Password根据提示到安装包中去找 二、本地仓库与私服连接 1.创建…

安信金业:18k和24k黄金的区别

黄金&#xff0c;作为永恒的贵金属&#xff0c;在人们心中拥有着独特的地位。而18K金和24K金&#xff0c;作为两种常见的黄金饰品&#xff0c;却常常让消费者感到困惑。今天&#xff0c;我们就来深入探讨18K金和24K金之间的区别&#xff0c;帮助你更好地理解它们各自的特性和价…

基于Qt的多线程并行和循序运行实验Demo

致谢&#xff08;Acknowledgement&#xff09;&#xff1a; 感谢Youtube博主Qt With Ketan与KDAB精心录制的Qt多线程处理应用教程&#xff0c;感谢Bilibili博主爱编程的大丙对Qt多线程与线程池内容深入浅出的讲解。 一、计算机线程相关概念 线程概念[1]&#xff1a; 在计算机科…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-27

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-27 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-27目录1. Large Language Model-based Augmentation for Imbalanced Node Classification on Text-Attributed Graphs摘要研究背…

ESD防静电监控系统提高3C电子厂的稳定生产

在当今信息技术迅速发展的时代&#xff0c;3C电子产品的生产需求日益增加。然而&#xff0c;随着生产规模的扩大和技术的不断进步&#xff0c;生产过程中面临的挑战也日益凸显。静电放电作为影响电子产品质量与可靠性的一个重要因素&#xff0c;受到越来越多厂商的重视。ESD防静…

matlab线性度计算程序

matlab线性度计算程序 环境 matlab2023a ads2020 原理 其中f(v)是曲线&#xff0c;fmax是f(v)的最大值&#xff0c;fmin是f(v)的最小值&#xff0c;vmax为fmax对应v值&#xff0c;vmin为fmin对应v值。 L∆fmax/(fmax-fmin) (1) ∆fmaxmax⁡[f(v)-[fmin-K*(v-vmin)]] (2) K(…

BUUCTF之web篇

第一题 [极客大挑战 2019]EasySQL 打开靶机后可以看到这是一个登陆的页面 我们可以尝试两种方式登录 弱口令爆破&#xff08;burpsuite&#xff09; 通过SQL注入里的万能密码来跳过账户和密码验证的过程 这里就需要万能密码aor true # 在这里单引号的作用是结束用户名或者密码…

Vue笔记-element ui中关于table的前端分页

对于 Element UI 表格的前端分页&#xff0c;可以在组件中使用 JavaScript 来实现数据的分页显示&#xff0c;而不必从后端获取已分页的数据。以下是一个简单的示例&#xff0c;演示如何在前端进行 Element UI 表格的分页&#xff1a; <template><div><el-tabl…

Tenda路由器 敏感信息泄露

0x01 产品描述&#xff1a; ‌ Tenda路由器‌是由深圳市吉祥腾达科技有限公司&#xff08;Tenda&#xff09;生产的一系列网络通信产品。Tenda路由器以其高性能、高性价比和广泛的应用场景而闻名&#xff0c;适合家庭、办公室和各种网络环境。0x02 漏洞描述&#xff1a…

助力AI智能化时代:全国产化飞腾FT2000+/64+昇腾310B服务器主板

在信息技术快速发展的今天&#xff0c;服务器作为数据处理和存储的核心设备&#xff0c;肩负着越来越重要的使命。全国产化的服务器主板&#xff0c;采用飞腾FT2000/64核处理器&#xff0c;搭配华为昇腾310的AI芯片&#xff0c;提供卓越的性能与可靠性。 核心配置&#xff0c;强…

SpringMVC学习(3)

目录 一、控制器Controller 二、RESTful风格 2.1 实际应用 三、结果跳转方式 3.1 ModelAndView 3.2 SpringMVC 3.2.1 无需视图解析器 3.2.2 需要视图解析器 3.3 ServletAPI 四、数据处理 4.1 处理提交数据 4.1.1 提交的域名称和处理方法的参数名一致 4.1.2 提交的…

淘宝商品评价API的获取与应用

随着电子商务的飞速发展&#xff0c;商品评价成为消费者做出购买决策的重要依据之一。对于电商平台而言&#xff0c;如何有效地管理和利用这些评价数据&#xff0c;提升用户体验和销售额&#xff0c;成为一个重要课题。淘宝作为国内最大的电商平台之一&#xff0c;其商品评价AP…

背包九讲——分组背包问题

目录 分组背包问题 问题定义 解题算法 问题解法 朴素解法&#xff1a; 一维优化解法 变式题型 背包问题第六讲——分组背包问题 背包问题是一类经典的组合优化问题&#xff0c;通常涉及在限定容量的背包中选择物品&#xff0c;以最大化某种价值或利益。问题的一般描述是…

模型 五遍沟通法(企业管理)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。确保信息准确&#xff0c;促进共识。 1 五遍沟通法的应用 1.1 五遍沟通模型案例&#xff1a;新员工入职培训 一家日本科技公司新招聘了一批员工&#xff0c;人力资源部门需要确保新员工对公司的文化…