【基础算法】单链表的OJ练习(3) # 移除链表元素 # 相交链表 #

news2025/7/16 10:16:48

文章目录

  • 前言
  • 移除链表元素
  • 相交链表
  • 写在最后

前言

  • 本章的OJ练习也是相对简单的,只要能够理解解题的思路,并且依照这个思路能够快速的写出代码,我相信,你的链表水平已经足够了。

  • 对于OJ练习(2) : ->传送门<-。其中两道题都可运用快慢指针的解题思路,这使得两个题都只需要遍历一次链表即可解答。

  • 对于本章,是链表的OJ练习的最后一篇较为简单的章节,后续的OJ练习将会上难度。


移除链表元素

  • 题目链接:-> 传送门 <-

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

在这里插入图片描述

  • 这里我们采用的方法是在原链表的基础上重新连接节点,将 Node.val == val 的节点跳过不连接。

  • 我们重新定义一个指向新连接的链表的头节点的指针newhead,然后在定义一个用来连接的指针cur,最终连接好后返回newhead即可。

  • Node.val != val 的节点作为新连接的链表的结点 ,如果一开始head为空或者head链表里全是等于val的结点,(初始化newnode = cur = NULL)此时连接操作就不进行,后面返回newnode(一直为NULL)即可。

在这里插入图片描述

在这里插入图片描述

下面是代码实现:

struct ListNode* removeElements(struct ListNode* head, int val){
	// cur为对新连接的链表的连接指针,newhead为新连接的链表的指向头节点的指针
    struct ListNode* cur = NULL, * newhead = NULL;
	
    struct ListNode* tmp = head;
    while (tmp)
    {
        if (tmp->val != val)   // 如果不等于val就连接
        {
            if (newhead == NULL)   // 连接时如果新的头为空,就将该节点作为头节点
            {
                newhead = cur = tmp;
            }
            else      // 正常连接
            {
                cur->next = tmp;
                cur = cur->next;
            }
        }
        tmp = tmp->next;   // 到下一个节点判断
    }
	
	// 如果head为空或者head链表里面所有节点的val都为所给的val,就说明没有新的头,这里判断是为了防止空指针解引用
	// 如果是正常情况,需要将新连接的最后一个节点的next指向NULL,如果已经指向NULL,多操作一步也没有问题
    if (cur) cur->next = NULL;

    // 最后返回新连接的链表的头
    return newhead;
}

相交链表

  • 题目链接:-> 传送门 <-

  • 该题目描述为:给你两个单链表的头节点 headAheadB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null

也就是:

在这里插入图片描述

在这里插入图片描述

解题思路:【双指针遍历

  • 首先我们可以先判断这两个链表是否有一个为空或者都为空,有空的情况那么一定不相交,此时直接返回NULL

  • 如果两个链表相交,那么从相交的那个起始节点开始,后面的长度是相同的。由此我们定义两个指针papb分别指向headA的头节点与headB的头节点并同时向后遍历链表。

  • 如果pa不为NULL,则移到下一个节点,如果pb不为空,也移到下一个节点。如果第一次遍历pa为空,则将pa指向headB的头节点;如果第一次遍历pb为空,则将pb指向headA的头节点。至于到底相不相交,第二遍遍历会见分晓。

  • 我们假设两个链表相交,那么设从相交的初始节点开始到NULL的长度为nheadA的头节点到相交的初始节点的长度为xheadB的头节点到相交的初始节点的长度为y。按照上一条的思路,当pa第一次遍历到达NULL时,pa一共走了x + n的长度,此时将pa指向headB的头节点;当pb第一次遍历到达NULL时,pb一共走了y + n的长度,此时将pb指向headA的头节点。仔细思考就会发现,paheadB走到相交的初始节点还需走y的长度,此时pa一共走了x + n + ypbheadA走到相交的初始节点还需走x的长度,此时pb一共走了y + n + x。这时,pa走的长度与pb走的长度恰好相等,且papb都刚好指向相交的初始节点。所以,该方法能够有效的找出那个相交的初始节点。

在这里插入图片描述

  • 如果两个链表不相交,也是一样,通过双指针分别依次向后遍历链表。如果两个链表长度相等,最终papb在第一次遍历的时候就都会到达NULL,此时返回NULL;如果两个链表长度不相等,同样的,在第一次遍历时,只要pa或者pb指向NULL,就将pa或者pb指向另外一个链表的头节点,然后继续遍历。我们假设headA链表的长度为xheadB链表的长度为y,当pa第一次遍历指向NULL时,走的长度为x,此时将pa指向headB的头节点;当pb第一次遍历指向NULL时,走的长度为y,此时将pb指向headA的头节点。不出所料,两个指针在第二次遍历链表时最后同时指向NULL,这是因为,paheadB的遍历要走的长度为y,此时pa总共走的长度为x + ypbheadA的遍历要走的长度为x,此时pb总共走的长度为y + x。可以看到,第二次遍历走完两个指针走的长度是相同的,并且两个指针都是指向NULL。所以,两个链表不相交,遍历的两个指针最终都是同时指向NULL

在这里插入图片描述

下面是代码实现:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    // 如果其中有一个链表为空或者全为空,说明不可能相交,直接返回NULL
    if(headA == NULL || headB == NULL) return NULL;

    struct ListNode* pa = headA, * pb = headB;

    // 对于headA与headB只有相交与不相交的情况
    // 相交则跳出循环
    // 不相交则再循环里面就返回
    // pa == pb说明找到相交的初始节点了,条件判断为假,跳出循环
    while (pa != pb)
    {
        // 同步向后遍历
        pa = pa->next;
        pb = pb->next;

        // 如果两个指针都指向空,说明headA与headB不相交
        if (pa == NULL && pb == NULL) return NULL;

        // 如果pa遍历完headA就到headB继续遍历
        if (pa == NULL) pa = headB;
        // 如果pb遍历完headB就到headA继续遍历
        if (pb == NULL) pb = headA;
    }   

    // 这里返回pa或者pb都是可以的,都指向相交的那个初始节点
    return pa;
}

写在最后

对于单链表的题目练习,最重要的是思路,我们在数据结构阶段要养成画图的习惯,因为它能帮助我们更好的理解。后续还会有单链表相关的题目练习。

感谢阅读本小白的博客,错误的地方请严厉指出噢!

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

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

相关文章

不平凡的一天——

作者&#xff1a;指针不指南吗 专栏&#xff1a;个人日常记录 &#x1f43e;或许会很慢&#xff0c;但是不可以停下来&#x1f43e; 文章目录1.自我介绍2.上学期3.不凡的一天4.新学期写个博客&#xff0c;简单记录一下&#xff0c;新学期加油&#xff01;&#xff01;&#xff…

day7 同步互斥

作业 1.将一个文件中的数据打印到终端上类似cat一个文件&#xff0c;要求如下 &#xff08;1&#xff09;a线程读取文件中的数据 &#xff08;2&#xff09;B线程将A线程读取到的数据打印到终端上 &#xff08;3&#xff09;文件打印完毕后&#xff0c;结束进程 方法1&#…

CMMI流程规范—服务与维护

服务与维护&#xff08;Service and Maintenance, SM&#xff09;是指产品销售之后的客户服务和产品维护。客户服务和产品维护的宗旨就是提高客户对产品以及对开发方的满意度。服务与维护过程域是SPP模型的重要组成部分。本规范阐述了服务与维护过程域的两个主要规程&#xff1…

蓝库云|五大关键引领制造业数字化智慧升级

蓝库云根据《2023制造产业趋势展望》报告&#xff0c;并归纳出「强化企业韧性与敏捷、提升留才诱因、建构多元供应链、兼顾安全的智慧工厂、循环催化永续经营」是牵动制造产业发展的五大关键。将永续目标整合至企业中长期策略中&#xff1b;数字化方面则搭配五大发展关键&#…

【Redis应用】基于Redis实现共享session登录(一)

&#x1f697;Redis应用学习第一站~ &#x1f6a9;本文已收录至专栏&#xff1a;数据库学习之旅 &#x1f44d;希望您能有所收获 &#x1f449;相关推荐&#xff1a;使用短信服务发送手机验证码进行安全校验 一.引入 ​ 在开发项目过程中&#xff0c;我们常常能碰到需要登录注…

Linux操作系统学习(文件IO)

文章目录基础IO系统相关接口文件描述符一切皆文件文件描述符的分配规则重定向fork后的文件描述符基础IO 系统相关接口 在C语言中对文件的操作有fopen打开、fclose关闭、fread读、fwrite写等函数&#xff1b;其实这些都是在系统调用接口上进行的封装。 这里介绍4个系统调用接…

【异常】因多租户字段缺少导致Error updating database. Column ‘tenant_id‘ cannot be null

一、报错内容 org.springframework.dao.DataIntegrityViolationException: ### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Column tenant_id cannot be null ### The error may exist in com/xxx/cloud/mall/admin/mapper/Goods…

303. 区域和检索 - 数组不可变

303. 区域和检索 - 数组不可变 给定一个整数数组 nums&#xff0c;处理以下类型的多个查询: 计算索引 left 和 right &#xff08;包含 left 和 right&#xff09;之间的 nums 元素的 和 &#xff0c;其中 left < right 实现 NumArray 类&#xff1a; NumArray(int[] num…

英语六级的三大经典句型

目录 1.强调句型&#xff08;提前想好要写在哪个地方&#xff09; 2.虚拟语气 3.第三个句型 3.倒装&#xff08;写一到两个倒装&#xff09; &#xff08;1&#xff09;否定词放在句首就是倒装 &#xff08;2&#xff09;so...that句型结构的句子将so引导的部分置于句首时…

一、一篇文章打好高数基础-函数

1.连续函数的性质考点分析函数的连续性主要考察函数的奇偶性、有界性、单调性、周期性。例题判断函数的奇偶性的有界区间为&#xff08;&#xff09; A.(-1,0) B(0,1) C(1,2) D(2,3)2.闭区间上连续函数的性质考点分析闭区间上连续函数的性质主要考察函数的最大最小值定理、零点…

JavaScript 函数参数

JavaScript 函数对参数的值(arguments)没有进行任何的检查。JavaScript 函数参数与大多数其他语言的函数参数的区别在于&#xff1a;它不会关注有多少个参数被传递&#xff0c;不关注传递的参数的数据类型。函数显式参数与隐藏参数(arguments)在先前的教程中&#xff0c;我们已…

删除启动台(LaunchPad)残留的图标

忘记什么版本的时候以前在 “应用程序” 删除应用后&#xff0c;启动台自动更新删掉 不知道什么时候开始&#xff0c;直接在 “应用程序” 里删掉后&#xff0c;启动台居然不能删除了…… 10.13和10.14后&#xff0c;无论是按住 Option&#xff0c;还是按住 Control Option …

Fisco-Bcos的环境搭建及Data-Export导出组件的使用

注意&#xff1a;由于Data-Export组件暂时只支持Fisco-Bcos 2.x系列&#xff08;这个也是目前使用最多最稳定的系列&#xff09;&#xff0c;故这里使用的是目前最新的Fisco-Bcos 2.x。 Fisco-Bcos链环境搭建 区块链网络部署 主要一步步按照这个官方的操作即可区块链网络搭建…

飞桨paddlespech 语音唤醒初探

PaddleSpeech提供了MDTC模型&#xff08;paper: The NPU System for the 2020 Personalized Voice Trigger Challenge&#xff09;在Hey Snips数据集上的语音唤醒(KWS)的实现。这篇论文是用空洞时间卷积网络&#xff08;dilated temporal convolution network, DTCN&#xff09…

Java 类和对象简介

类是对象的抽象&#xff0c;是一组具有相同特性&#xff08;属性&#xff0c;事物的状态信息&#xff09;和行为&#xff08;事物能做什么&#xff09;的事物的集合&#xff0c;可以看做一类事物的模板。 对象是类的实例化&#xff0c;是具体的事物。 比如&#xff1a;人类和…

linux基本功之列之wget命令实战

文章目录前言一. wget命令介绍二. 语法格式及常用选项三. 参考案例3.1 下载单个文件3.2 使用wget -o 下载文件并改名3.3 -c 参数&#xff0c;下载断开链接时&#xff0c;可以恢复下载3.4 wget后台下载3.5 使用wget下载整个网站四. 补充与汇总常见用法总结前言 大家好&#xff…

C. Good Subarrays(前缀和)

C. Good Subarrays一、问题二、分析三、代码一、问题 二、分析 这道题目的意思就是给我们一个数组&#xff0c;然后我们从数组中选取一个连续的区间&#xff0c;这个区间满足条件&#xff1a;区间内的元素和等于区间的长度。 对于区间和问题我们先想到的是前缀和的算法。 那…

【测绘程序设计】——空间直角坐标转换

测绘工程中经常遇到空间直角坐标转换——比如,北京54(或西安80)空间直角坐标转换成CGCS2000(或WGS-84)空间直角坐标,常用转换模型包括:①布尔沙模型(国家级及省级范围);②莫洛坚斯基模型(省级以下范围);③三维四参数(小于22局部区域) 等。   本文分享了基于布…

Scala变量和数据类型

文章目录Scala变量和数据类型一、注释1. 基本语法2. 案例实操3. 代码规范二、变量和常量&#xff08;重点&#xff09;1. 回顾&#xff1a;Java 变量和常量语法2. 基本语法3. 案例实操三、标识符的命名规范1. 命名规则2. 案例实操四、字符串输出1. 基本语法2. 案例实操五、键盘…

【大数据监控】Grafana、Spark、HDFS、YARN、Hbase指标性能监控安装部署详细文档

目录Grafana简介下载软件包安装部署修改配置文件创建用户创建Systemd服务启动 GrafanaSpark应用监控 Graphite_exporterHDFS 监控YARN 监控HBase 监控Grafana 简介 Grafana 是一款开源的数据可视化工具&#xff0c;使用 Grafana 可以非常轻松的将数据转成图表(如下图)的展现形…