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

2024-05-15 17:12

本文主要是介绍数据结构~~带环链表的环开始的节点位置**两种方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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.chinasem.cn/article/992423

相关文章

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Apache Tomcat服务器版本号隐藏的几种方法

《ApacheTomcat服务器版本号隐藏的几种方法》本文主要介绍了ApacheTomcat服务器版本号隐藏的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1. 隐藏HTTP响应头中的Server信息编辑 server.XML 文件2. 修China编程改错误

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

JavaScript DOM操作与事件处理方法

《JavaScriptDOM操作与事件处理方法》本文通过一系列代码片段,详细介绍了如何使用JavaScript进行DOM操作、事件处理、属性操作、内容操作、尺寸和位置获取,以及实现简单的动画效果,涵... 目录前言1. 类名操作代码片段代码解析2. 属性操作代码片段代码解析3. 内容操作代码片段代码解析4.

SpringBoot3集成swagger文档的使用方法

《SpringBoot3集成swagger文档的使用方法》本文介绍了Swagger的诞生背景、主要功能以及如何在SpringBoot3中集成Swagger文档,Swagger可以帮助自动生成API文档... 目录一、前言1. API 文档自动生成2. 交互式 API 测试3. API 设计和开发协作二、使用