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

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

相关文章

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri