数据结构~~带环链表的环开始的节点位置**两种方法

1.带环链表环开始的位置

(1)上面的这个测试用例使用的是包含了4个节点的带环链表,我们要找的就是链表里面的环开始的节点的位置,拿这个测试用例而言,就是2这个节点,从这个节点开始,我们的链表就形成了一个环,我们要设计程序说明在普适的情况下面如何找到这个环开始位置的节点;

(2)我们这里的思路和之前的一个判断链表是否存在环的相同的思路,我们的快指针肯定会先进入这个环,慢指针后进入这个环,当慢指针进入环的时候,我们的快指针肯定已经在环里面走了好几圈了,我们假设慢指针一次走1步,快指针一次走2步,因为在这个过程中快指针每次都比慢指针多走一步,这个时候就一定是可以追上的;

(3)这个题目的解题方法,其实很简单,但是你可能之前从来没有考虑过这个问题,就是在环上面快慢指针相遇的地方我们设置为meet指针,在开始的位置,我们设置为head指针(注意这里的head指针是指的最开始的位置,下面的图里面有表示),这个时候让meet指针一次走一步,head指针一次走一步,这样进行下去,他们相遇的地方,就是我们的题目里面要求的环的节点的初始位置;是不是很神奇,你可能会问,一定会在这个环的开始节点的位置相遇吗,为什么会这么巧?对就是这样的,一定会相遇的,我们是可以通过数学推演证明出来;

(4)我们利用的等量关系就是快指针走过的路程是慢指针的两倍(这个并不是题目里面给出的,而是我们自己使用的),我们肯定是要在题目里面进行说明的,代码表示就是fast=fast->next->next而慢指针则是slow=slow->next这样表示的就是我们设置的慢指针一次走一步,快指针一次走两步,我们分别表示出来再相遇的时候两个指针各自走过的路程,利用快指针的路程==慢指针路程的两倍进行列式计算,就可以得到一个等量关系,这个等量关系就可以说明meet和head指针相遇的位置就是我们要求的环的初始位置节点;

(5)这个路程的表示还是要使用到这个图,L表示的是没有进环之前走过的路程,N表示的就是慢指针进环到这两个指针相遇走过的路程,我们还是假设这个环上面的节点元素的个数是C,慢指针走过的路程就是进环之前的L加上进环之后的N,快指针走过的路程就是进环之前的L加上(我们假设慢指针进环的时候,快指针已经走过了x圈),x*c还要加上N(这个地方可能比较难以理解,多去领悟吧);

(6)利用快指针走的路程是慢指针2倍,就可以得到L=x*C-N这个表达式,当这个X=1的时候L==C-N那么就是说head指针进环之前的路程恰好可以让meet指针走过C-N到达环开始节点位置在这个位置相遇,这个我们是可以很直观的看出来的,但是x等于其他的不是一的数字的时候,好像就不是非常直观了;

(7)我们对于原来的式子稍加化简,得到L=(x-1)*C+C-N,这样的话就是说当head指针走过L路程的时候,我们的meet指针走过x-1圈加上C-N这段路程,两者还是会在这个环的初始位置相遇的。

(8)具体的代码如下所示:


下面我们介绍这个题目的第二种方法,因为上面的这个方法虽然简单,但是似乎不容易想到,因为如果我们是第一次做,我们是很难想到的,下面我们介绍的方法是基于我们之前的相交链表实现这个环的头部位置节点的查找:

就是我们现在是相当于把这个环形从meet这个位置断开,让meet->next定义为newhead指针,这个时候meet后面已经没有东西了,所以我们就要把这个meet->next置空;

这个时候就把这个找环开始位置节点的问题,转换为求解两个链表的相交节点,这个相交接点恰好是我们想要查找的环形链表的开始位置的节点(通过上面的图片可以清晰的看出来);这两个链表一个就是原本的以head为节点的链表,另外的一个就是以我们自己重新进行定义的newhead作为头部节点的链表,我们接下来的工作就是找这两个链表的相交节点;

这个时候我们只需要对于这个程序稍加修改就可以了:修改的地方如下

(1)这个时候我们首先要把meet指针的next节点设置为newhead节点,让后把这个meet->next置空(这个时候newhead是不会受到影响的,因为就相当于是把meet和后面节点的连接给切断了)

(2)我们需要把之前的判断相交节点代码拷贝过来就可以了,然后在这个函数里面调用求解两个链表相交节点的函数,我们需要传递的参数就是head和newhead这两个作为参数;对于这个相交节点的问题,可以看我之前的这个博客,里面有详细的介绍;

链表-----返回倒数第K个节点&&回文结构的判断&&相交链表-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/binhyun/article/details/138368598?spm=1001.2014.3001.5502(3)detectcycle函数里面,我们也是要进行相应的修改的,就是添加meet节点,定义newhead节点,然后把meet->next置空,最后把这个getintersrctionnode这个函数的返回值作为detectCycle函数的返回值就可以了。

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】栈的实现(顺序栈)

文章目录 栈的概念和结构栈的实现1.顺序存储结构栈的定义初始化栈入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空,如果为空返回非零结果,如果不为空返回0销毁栈栈的打印 完整代码(包括测试代码)Stack.hStack.ctest.c 栈…

代码随想录Day 47|Leetcode|Python|392.判断子序列 ● 115.不同的子序列

392.判断子序列 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的…

可以当回音壁使用的蓝牙条形音箱中应用的蓝牙芯片

条形音箱(英语:Soundbar)是一个有立体声效的音箱,通常放置于屏幕的上方或下方,基于声学的考虑,此种音箱多为长条形设计,故名。无线蓝牙条形音箱也一样,银色磨砂铝合金中框。搭配黑色…

JavaScript基础知识强化:变量提升、作用域逻辑及TDZ的全面解析

🔥 个人主页:空白诗 文章目录 ⭐️ 引言🎯 变量提升(Hoisting)👻 暂时性死区(Temporal Dead Zone, TDZ)解释📦 var声明🔒 let与const声明📖 函数声明 与 函数表达式函数声…

“网络安全新纪元:等保2.0的详细解读与实践”

网络安全等级保护基本要求》(等保2.0)于2019年6月发布,是我国网络安全等级保护制度的一项重要标准。等保2.0主要针对关键信息基础设施的网络安全保护,对数据安全和个人信息保护提出了更高的要求。本文将对等保2.0进行详细解读&…

导电材料——分类、性能与应用

本篇为西安交通大学本科课程《电气材料基础》的笔记。 导电材料指的是能在电场下传导电流的材料。导体价电子所在能带为半满带,且相邻能级间隔小,外电场下电子很容易从低能级跃迁到高能级上,大量的电子很容易获得能量进行共有化运动&#xf…

队列的实现与OJ题目解析

"不是你变优秀了, 那个人就会喜欢你." 文章索引 前言1. 什么是队列2. 队列的实现3. OJ题目解析4. 总结 前言 感情可以培养是个伪命题. 如果有足够多的时间和爱, 就可以让另一个人爱上你的话, 那谁和谁都可以相爱了. 爱情之所以会让人死去活来, 是因为, 答案都写在了…

Skywalking 介绍及应用(从0到1)完整版

微服务全链路追踪 一、APM 系统 APM 系统是可以帮助理解系统行为、用于分析性能问题的工具以便发生故障的时候,能够快速走位和解决问题。 告警规则 SkyWalking 的发行版都会默认提供config/alarm-settings.yml文件,里面预先定义了一些常用的告警规则。…

海外静态IP:全球互联的稳定之选

在全球化的商业环境中,企业与个人对于网络的依赖日益加深,而一个稳定、可靠的海外静态IP成为了连接世界的关键。本文将从五个方面深入探讨海外静态IP的重要性、应用场景、技术优势、市场趋势以及选择时的考量因素。 一、海外静态IP的重要性 静态IP地址是…

DC-DC直流升压线性可调电源模块电压控制输出0-50V/0-80V/0-100V/0-200V/0-250V/0-300V/0-500V/0-1000V

特点 效率高达 75%以上1*2英寸标准封装单电压输出可直接焊在PCB 上工作温度: -40℃~75℃阻燃封装,满足UL94-V0 要求温度特性好电压控制输出,输出电压随控制电压线性变化 应用 GRB 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为:4.5~9V、…

sentinel搭建及使用

1.添加依赖(版本可依赖于父pom) SentinalResource注解: 添加依赖: blockhandler: fallback:

使用 python 整理 latex 的 bib 文献列表

目录 bib 文献整理脚本前提条件与主要功能原理编程语言与宏包基础完整程序 bib 文献整理脚本 本文主要用于解决 Latex 写作过程中遇到的 bib 文献整理问题,可处理中文文献。 LaTeX是一种基于ΤΕΧ的排版系统,它非常适用于生成高印刷质量的科技和数学类…