数据结构练级之路【链表带环问题】

news2024/9/20 20:51:13

一、链表带环问题的代码和几个经典的面试题(重点在于如何算入口点)

代码非常的简单,但是有几个关于带环问题的讲解就比较不好理解

1.有关链表是否带环的题目和代码

(较难且较经典)(有关链表带环的问题)(经典的引用了快慢指针的使用)(追击问题)
题目:给定一个链表,判断链表中是否有环。
意思:如果链表中有某一个结点,可以通过连续跟踪next指针再次到达,则链表中存在环,为了表示给定链表中的环,我们使用整数pos来表示链表尾链接到链表中的位置(索引从0开始),
如果pos的位置是-1.则在该链表中没有环,注意pos不作为参数进行传递,仅仅是为了标示链表的实际情况。
思路:使用快慢指针(slow和fast都从头结点开始,slow一次走一步,fast一次走两步,不带环fast就会为空,带环fast就会追上我的slow);

实现:

bool hasCycle(struct ListNode* head)//有环就返回true无环就返回false
{
	struct ListNode* fast = head;
	struct ListNode* slow = head;
	while (fast && fast->next)//这个就是一次走两步,此时就会涉及到一个奇偶的问题,所以两个条件都要进行判断
	{
		slow = slow->next;
		fast = fast->next->next;

		if (slow == fast)//这步就是表示我追击到了(此时就是可以表明这个链表是带环的链表)
		{
			return true;
		}
	}

	return false;

}

2.经典的带环问题1

问题:问为什么slow走一步,fast走两步最后一定可以相遇?

解答:因为假如fast在追击slow的时候(此时的fast已经入环了,然后假设此时它们之间的距离是N),因为此时的fast每次都比slow多走一步,所以此时的距离就会从N到N-1,这样一直走下去,N肯定可以变成0,所以肯定可以找到

3.经典带环问题2

问题:问假如fast此时不走两步而是走n步,此时还一定可以找到吗?

解答:答案首先是:不可以;原因:

假如此时的fast走的是3步,距离还是N,fast每次比slow多走2步,所以此时是N-2,N-4(所以就可以显然看出此时假如N是一个奇数就不能追到,只有当N是一个偶数的时候才可能追到),所以不一定可以追到,并且如果继续往下一圈走的时候,如果此时还是没有追到(那么此时的这个fast就不可能找到slow了);因为:假如此时的N是一个奇数,然后此时就会导致fast在slow的前面(如果当我的fast在slow的前面时,此时的fast和slow的距离就发生的大改变,从小变成了最大,因为此时fast在前,所以距离就变成了环的长度-1(C-1)),所以假如C-1是一个奇数就会导致N是奇数(那么此时就又是那个道理,N是奇数就追不到),只有当C-1(N)是一个偶数时,才有可能追上,所以关键追上与追不上就是取决去(环的长度是奇数还是偶数),但是还要注意这边是有一个减1的,所以环的大小是偶数就追不到,环的大小是一个奇数就可以找到

4.如何求环的入口点?(理论解答)

第一种方法:

环的入口点的思路:一个指针从相遇点开始走,一个指针从链表头结点开始走,它们会在环的入口点相遇
为什么是这样的呢?所以下面我们就来介绍一下为什么一个指针从相遇点开始走,一个指针从链表头结点开始走,它们会在环的入口点相遇呢?

由上述的思路我们此时假设:
从头结点到入环点的距离是:L
环的长度是:C
慢指针在环中走的距离为:X
走的圈数是:N
所以此时在追上到相遇的过程中
慢指针走的距离:L+X
快指针走的距离:L+X+C 而是 L+X+N*C
又因为快指针走的路程是慢指针的2倍
所以此时就可以得到一个等式:
2 * (L+X) = L+X+N * C
变形得到:L+X=N * C
变形得到:L=N * C-X
变形得到:L=(N-1)*C+C-X
所以此时通过这个表达式,此时就可以得到 L=C-X;因为此时的N-1可以看成是一个整数倍的圈数,就可以看成是在循环,其实还是从这个位置开始
所以就得到了 L=C-X; 所以我们就证明了这句话 :一个指针从相遇点开始走,一个指针从链表头结点开始走,它们最终会在环的入口点相遇。

下面是图示:
在这里插入图片描述

具体求入口点的代码:

struct ListNode* detectCycle(struct ListNode* head)
{
	struct ListNode* slow = head;
	struct ListNode* fast = head;
	while (fast && fast->next)
	{
		slow = slow->next;
		fast = fast->next->next;
		if (slow == fast)//这个条件会成立的话就表示我链表是有环的,并且此时追到了
		{
			struct ListNode* meet = slow;
			//此时的这个循环中的结论就是由我的公式证明出来的
			while (meet != head)
			{
				meet = meet->next;
				head = head->next;
			}

			return meet;
		}
	}

	return NULL;

}

第二种方法:

就是可以先算出这个环的相遇点,然后把这个点给断开,然后就可以非常巧妙的把这个判断环的相遇点的问题给转换成求交点的问题(但是代码实现起来优点困难)

二、总结:

以上就是有关链表带环的一系列问题,建议反复画图理解

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

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

相关文章

《零基础学机器学习》笔记-第1课-MNIST数字识别

机器学习项目的实际过程大致可以分为5个环节,下面以卷积神经网络分析MNIST数据集为例实战一下。 MNIST数据集-卷积神经网络-python源码下载 一、问题定义 MNIST数据集,相当于机器学习领域的Hello World,非常经典,包括60000张训练…

JAVA队列及实现类

什么是队列? 队列是一种特殊的线性表,遵循先入先出、后入后出的基本原则,一般来说,它只允许在表的前端进行删除操作,而在表的后端进行插入操作,但是java的某些队列运行在任何地方插入删除;比如我…

常用网络接口自动化测试框架应用

一、RESTful(resource representational state transfer)类型接口测试 (一)GUI界面测试工具:jmeter 1、添加线程组 2、添加http请求 3、为线程组添加察看结果树 4、写入接口参数并运行 5、在查看结果树窗口查看结果 6、多组数据可增加CSVDat…

git原理浅析

1.git概念 我们的项目一般由文件夹和文件组成,在文件系统中,基本都是树形结构, 在git中,文件夹称为 “tree” ,文件称为 “blob” ,顶层文件夹称为 “top-level tree” 。下方的目录结构是个例子而已: . (top-level t…

Global Mapper栅格计算器,波段计算NDVI、NDSI、NDWI等

Global Mapper栅格计算器,波段计算NDVI、NDSI、NDWI等1. Global Mapper中的栅格计算器2. 查看数据属性,检查波段数量3. 打开栅格计算器,进行波段计算Global Mapper功能丰富,其栅格计算器工具内置很多遥感指数,方便进行…

TwineCompile高级编译系统

TwineCompile高级编译系统 TwineCompile是我们对C编译速度慢的解决方案。通过使用多线程、文档缓存和自动化后台编译技术,集成到CBuilder IDE中,大大降低了编译/制作/构建的次数。 TwineCompile是一个创新的电子书系统,它利用多线程工程和缓存…

Java项目:SSM学生选课管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 由SpringMVCMyBatis为主要框架,mysql8.0配置主从复制实现读写分离。前端主要由bootstrap完成,背景用particles.js插件。…

Spring Boot整合JWT实现用户认证

初探JWT 什么是JWT JWT(Json Web Token),是一种工具,格式为XXXX.XXXX.XXXX的字符串,JWT以一种安全的方式在用户和服务器之间传递存放在JWT中的不敏感信息。 为什么要用JWT 设想这样一个场景,在我们登录一个网站之后&#xff0…

[Cortex-M3]-2-map文件解析

目录 1 几个问题 1.1 什么是map文件 1.2 如何查看编译出的程序和数据的信息 1.3 如何生成map文件 1.4 map文件里面有哪些信息 2 map文件信息详解 2.1 Section Cross References 2.2 Removing Unused input…

15年磨一剑,亚马逊云科技数据产品掌门人 Swami 揭秘云原生数据战略的三大关键要素

2022亚马逊云科技 re:Invent 全球大会正在拉斯维加斯如火如荼进行中,亚马逊云科技数据与机器学习副总裁 Swami Sivasubramanian 博士发表了“数据与机器学习如何助力企业构建端到端的数据战略”的主题演讲来开启第三天的日程。 Swami 博士重点介绍了亚马逊云科技在…

玉米脱粒机设计全套

目 录 摘要 I Abstract II 1引言 1 1.1 课题的来源与研究的目的和意义 1 1.2 本课题研究的内容 3 2玉米脱粒机总体结构的设计 5 2.1 玉米脱粒机工作方式的选择 7 2.2 玉米脱粒机的结构原理 10 2.3 机械传动部分的设计计算 11 2.3.1电机的选型计算 12 2.3.2 V带传动的设计计算 1…

C语言:文件操作(2)

文件的打开和关闭 文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。 在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。 ANSIC规定使用fopen函数来打开文…

(十五) 共享模型之工具【线程池】

一、自定义线程池 1. 简易线程池 Slf4j(topic "c.TestPool") public class TestPool {public static void main(String[] args) {ThreadPool threadPool new ThreadPool(2,1000, TimeUnit.MILLISECONDS, 10);for (int i 0; i < 5; i) {int j i;threadPool.exe…

博球一看,记录疯狂!我与世界杯的那些二三事

文章目录 &#x1f525;关于世界杯 &#x1f525;关于2022卡塔尔世界杯 &#x1f525;我与足球 &#x1f525;我与世界杯 ⚽分享一颗足球 ⚽实现效果 &#x1f525;关于世界杯 大力神杯 国际足联世界杯&#xff08;FIFA World Cup&#xff09;&#xff0c;简称“世界杯”…

Vue中的数据代理与数据劫持

数据代理 数据代理字面上是通过一个对象代理对另一个对象属性的操作在vue中的数据代理&#xff0c;实际上是通过vm上的属性代理对_data中属性的操作 数据劫持 数据劫持也可称作数据代理&#xff0c;字面上是劫持到某个属性的变化&#xff0c;去做其他的操作在vue中的数据劫…

练习:查询学生新学期选课(python之str、dict、list试炼)

查询学生新学期选课(python之str、dict、list试炼)&#xff0c;数据用字典、列表存储。考验字符串的各种转换&#xff0c;字典、列表的读写。 (本文获得CSDN质量评分【88】)【学习的细节是欢悦的历程】Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免…

【Git 教程系列第 26 篇】Mac 升级系统到 Ventura 后,Git 公钥报 Permission denied 错误问题的解决方案

这是【Git 教程系列第 26 篇】&#xff0c;如果觉得有用的话&#xff0c;欢迎关注专栏。 注&#xff1a; 如果你是因为升级系统到 Ventura 后遇到的这个问题&#xff0c;可以直接看第三步的解决方案&#xff0c;前两步是我自己的写作习惯&#xff0c;只是记录一下这个过程&…

Qt OpenGL 图形字体的纹理映射

这次教程中&#xff0c;我们将在第14课的基础上创建带有纹理的字体&#xff0c;它真的很简单。也许你想知道如何才能给字体赋予纹理贴图&#xff1f;我们可以使用自动纹理坐标生成器&#xff0c;它会自动为字体上的每一个多边形生成纹理坐标。 这次课中我们还将使用Wingdings字…

BNext

又搬来了大神器啊 来自德国HassoPlattner计算机系统工程研究院的NianhuiGuo和HaojinYang等研究者提出了BNext模型&#xff0c;成为第一个在ImageNet数据集上top1分类准确率突破80%的BNN。 两年前&#xff0c;依靠早期 BNN 工作 XNOR-Net 起家的 XNOR.AI 被苹果公司收购&#…

redis基础5——redis的频道订阅和模式频道、redis主从复制、哨兵集群

文章目录一、发布订阅1.1 发布订阅过程1.2 发布订阅类型1.2.1 频道的发布订阅1.2.1.1 订阅频道* 实现原理1.2.1.2 发送消息* 实现原理1.2.1.3 退订频道* 实现原理1.2.2 模式的发布订阅1.2.2.1 订阅模式频道* 实现原理1.2.2.2 查询订阅与发布系统状态1.2.2.3 发送消息* 实现原理…