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

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.mzph.cn/diannao/13673.shtml

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

相关文章

【第16章】MyBatis-Spring之SqlSession

文章目录 前言一、SqlSessionTemplate1. 创建2. 使用3. 批量操作3.1 创建SqlSessionTemplate3.2 service3.3 controller 二、SqlSessionDaoSupport总结 前言 在 MyBatis 中,你可以使用 SqlSessionFactory 来创建 SqlSession。 一旦你获得一个 session 之后&#xf…

源码部署EFK

目录 资源列表 基础环境 关闭防护墙 关闭内核安全机制 修改主机名 添加hosts映射 一、部署elasticsearch 修改limit限制 部署elasticsearch 修改配置文件 单节点 集群(3台节点集群为例) 启动 二、部署filebeat 部署filebeat 添加配置文件 启动 三、部署kiban…

单点登录【demo】

前言 2023-07-29 15:44:56 公开发布于 2024-5-22 00:04:56 单点登录【demo】 以下是 Java 实现单点登录的示例代码: 单点登录(Single Sign-On,SSO)是一种身份认证和授权机制,可以使用户在多个应用程序或系统之间使…

SQL常用基础语句(一)-- FGHIJ开头

GROUP BY GROUP BY语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。在GROUP BY子句后面包含了一个HAVING子句,HAVING类似于WHERE,(唯一的差别是WHERE过滤行,HAVING过滤组&#xff0…

【C/C++笔试练习】TCP、IP广播、ARP协议、IP路由器、MAC协议、三次握手、TCP/IP、子网划分年、会抽奖、抄送列表

文章目录 C/C笔试练习选择部分(1)TCP(2)IP广播(3)ARP协议(4)IP路由器(5)MAC协议(6)三次握手(7)TCP/IP&#xf…

PHP在线制作表白网源码

PHP在线制作表白网源码,送女友个惊喜吧,无数据库,上传就能用,后台/admin,账号密码都是admin 百度网盘:https://pan.baidu.com/s/1rbD2_8IsP9UPLK-cdgEXfA?pwdre59

AWS安全性身份和合规性之Secrets Manager

AWS Secrets Manager是一项AWS托管的服务,用于安全地存储、管理和轮转敏感信息,如数据库密码、API密钥、OAuth令牌等。AWS Secrets Manager助您在整个生命周期内轻松管理、检索和轮换数据库凭证、API密钥和其他密钥。 关键词:集中管理、加密…

sql使用加和进行合并去重并提升速率

背景 有三张表ltd1 、ltd0051和、ltd0011ltd1作为主表,左关联 ltd0051和ltd0011如果ltd0051有两条重复数据、td0011有两条重复数据,左关联之后就会得到4条,同时ltd0051和ltd0011这两条数据都是正确,基于主键我们需要将两个相同主键…

【全开源】AJAX家政上门服务系统小程序自营+多商家(高级授权)+独立端

基于FastAdmin和原生微信小程序开发的一款同城预约、上门服务、到店核销家政系统,用户端、服务端(高级授权)、门店端(高级授权)各端相互依赖又相互独立,支持选择项目、选择服务人员、选择门店多种下单方式,支持上门服务和到店核销两种服务方式…

深入理解数仓开发(一)数据技术篇之日志采集

前言 今天开始重新回顾电商数仓项目,结合《阿里巴巴大数据之路》和尚硅谷的《剑指大数据——企业级电商数据仓库项目实战 精华版》来进行第二次深入理解学习。之前第一次学习数仓,虽然尽量放慢速度力求深入理解,但是不可能一遍掌握&#xff0…

我在去哪儿薅到了5块钱火车票代金券,速薅

哈哈,亲爱的薅羊毛小伙伴们! 刚刚在去哪儿大佬那儿发现了一个超级薅羊毛福利!我只花了短短两分钟,就搞到了一张5块钱火车票代金券,简直是天上掉馅饼的节奏啊! 话不多说,薅羊毛的姿势给你们摆好…

代码随想录算法训练营第十六天(py)| 二叉树 | 104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

104.二叉树的最大深度 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 思路1 迭代法 层序遍历 层序遍历的思路很简单,其结果本来就是按层数记录的,只需返回结果的长度皆可。…

【C语言回顾】联合和枚举

前言1. 联合体1.1 联合体的声明1.2 联合体的特点1.3 联合体的使用 2. 枚举2.1 枚举的声明2.2 枚举的特点2.3 枚举的使用 结语 #include<GUIQU.h> int main { 上期回顾: 【C语言回顾】结构体 个人主页&#xff1a;C_GUIQU 专栏&#xff1a;【C语言学习】 return 一键三连;…

解决法律条文的录入前判断发条冲突的需求;怎么选择NLPModel?怎么使用模型?

要在NLPModel类中实现法律条文的冲突检测功能&#xff0c;可以使用BERT模型来计算句子相似度。以下是详细的步骤&#xff0c;包括如何选择模型、训练模型以及使用模型。 选择NLP模型 根据你的需求&#xff0c;BERT&#xff08;Bidirectional Encoder Representations from Tra…

Linux多线程系列三: 生产者消费者模型,信号量使用,基于阻塞队列和环形队列的这两种生产者消费者代码的实现

Linux多线程系列三: 生产者消费者模型,信号量,基于阻塞队列和环形队列的这两种生产者消费者代码的实现 一.生产者消费者模型的理论1.现实生活中的生产者消费者模型2.多线程当中的生产者消费者模型3.理论 二.基于阻塞队列的生产者消费者模型的基础代码1.阻塞队列的介绍2.大致框架…

别说废话!说话说到点上,项目高效沟通的底层逻辑揭秘

假设你下周要在领导和同事面前汇报项目进度&#xff0c;你会怎么做&#xff1f;很多人可能会去网上搜一个项目介绍模板&#xff0c;然后按照模板来填充内容。最后&#xff0c;汇报幻灯片做了 80 页&#xff0c;自己觉得非常充实&#xff0c;但是却被领导痛批了一顿。 这样的境…

树的非递归遍历(层序)

层序是采用队列的方式来遍历的 就比如说上面这颗树 他层序的就是&#xff1a;1 24 356 void LevelOrder(BTNode* root) {Que q;QueueInit(&q);if (root){QueuePush(&q, root);}while (!QueueEmpty(&q)){BTNode* front QueueFront(&q);QueuePop(&q);print…

简析网络风险量化的价值与应用实践,如何构建网络风险预防架构

网络风险量化能够让公司董事会和高管层看清当前的网络安全风险格局&#xff1b;它还将使安全团队能够在业务需求的背景下做出网络安全决策&#xff0c;帮助组织确定哪些风险对业务构成最大的威胁&#xff0c;以及预期的经济损失将是什么。 随着网络攻击手段的日益多样化和复杂…

多模态大模型新进展——GPT-4o、Project Astra关键技术丨青源Workshop第27期

青源Workshop丨No.27 多模态大模型新进展—GPT-4o、Project Astra关键技术主题闭门研讨会 刚刚过去的两天&#xff0c;OpenAI、Google纷纷发布了多模态大模型的最新成果&#xff0c;GPT-4o、Project Astra先后亮相。 本周五&#xff08;北京时间5月17日&#xff09;18点&#x…

O2OA(翱途)开发平台数据统计如何配置?

O2OA提供的数据管理中心&#xff0c;可以让用户通过配置的形式完成对数据的汇总&#xff0c;统计和数据分组展现&#xff0c;查询和搜索数据形成列表数据展现。也支持用户配置独立的数据表来适应特殊的业务的数据存储需求。本文主要介绍如何在O2OA中开发和配置统计。 一、先决…