判断单链表是否带环且返回节点

         今天鄙人为大家带来的是一道简单的逻辑运算题。用用到了一个我们在链表中提及过的方法快慢法。这道题其实没啥考的实际意义。只是我们如果能了解这道题的解决方法的话。对我们后面梳理逻辑会有很大的帮助。

单链表的题目

     我们可以看到上面的题目。就是让我们判断是否带环。也许大家这样看起来可能不是很直观,那么我们重新画一个图,大家看着可能会更好一点。

        大家可以看到这个图里面给我表示的是这个链表没有进环的地步。然后有一个竖直的黑点,就是他们环相交的地方。那么我们只需要判断是否存在这么一个点,那么就是不是能够判断是否带环了。 那么我们如何来判断他们是否有这么个点呢?然后这就是我们开始在序言中说的快慢指针的方法了。那什么叫快慢指针呢?快慢指针就是一个快,一个慢慢。例如一个指针每次走一步,一个指针每次走两步。我们以这个图为例。当慢支撑走了我的一半的话,那么快指针就已经走到他们的相交点了(就是那个黑色柱子)。当慢指针走到那个焦交点的时候,快指针已经在c里面走了一段时间了。然后当慢指针继续往前走,快指针也快速走。那么这就变成了我们的追赶问题了。如果带环的话,那么快指针一定会追慢指针的,因为我比你快一步,那么相当于我每次去和你的距离都会减一。无论我们会计人是走两步还是走三步走四步都会追上。如果是走技术的话,那么就是相当于转第二圈才能追上。并且这个不存在追不上的问题。我们经过认证证明是一定会追上的,不存在不上的条件。如果你的距离是奇数的话,那么就要转两圈才能追上,如果是偶数,则第一圈就追上了。

       但是我们前面都是考虑的带环的,我们肯定也有不带环的呀。那么我们是不是当快指针或者快指针的下一步为NULL了?那么就代表他们走到结尾了,说明他们就不带环了。

       那有没有存在当慢指针走到了相交节点?快指针还没有追上他呢。大家需要注意一下,这是不存在的。因为当慢指针走到相交节点就代表了他已经转了c一圈了。因为我们快指针比慢指针快。动漫直升都走了一圈了,快指针还没追上,那么就代表这个是不存在的。

       我想当大家看到这里了,应该也大概了解了我们这个的解题思路是什么。就是创建两个指针从头开始往前走,一个走一步,一个走两步。当快指针与慢指针相等,那么就代表他们有还我们就返回ture否则就返回false

代码实现

        其实这个就是很经典的想出来很难写出来很简单的问题了。我们上面也说过,我就是创建两个新节点,从头开始走,如果相遇了,那就返回ture反之亦然。

bool hasCycle(struct ListNode *head) {struct ListNode* man=*head;struct ListNode* kuai=*head;while(kuai&&kuai->next){man=man->next;kuai=kuai->next->next;if(man=kuai)return ture;}return false;
}

        这写出来是很简单的。主要是大家能知道这个方法就好很多了。大家知道这个思想,但是如果我们在力扣上回答这个问题的话,需要变一下。但是我们思想是正确的。毕竟我用他们自己的这个题目的解题都会有报错。不知道为什么。

返回节点

        

          我们要返回节点的话,就是相当于我们要返回那个黑色的柱子A。我们在前面也说过了,h和相遇就代表有环,所以我们需要判断是否有a的话。我们有两种方法。但都会用到我们前面写的判断是否有环。因为我们要借用他们快慢相遇的那个节点。我们的第一种方法就是在快慢指针相遇的地方再创建一个节点。并且在l的开头创建一个节点,他们同时向是下走。当他们相遇,那么就返回这个节点,就说明这是我们的黑色柱子a了。大家会想想啊,这是为什么呀?为什么他们这就相遇了就返回这个节点了?大家可以看我接下来写一个公式,思考一下是不是这样的?

        其中Y代表的是快指针是慢直针的几倍,然后右边代表的快指针走的步数。左指针是慢指针走的步数。 我们以快指针针是慢指针的二倍来计算。

      其中x为快指针在c里面走了多少圈。这样看起来是不是减少出来?L就等于快慢指的相遇后面的节点嘛。 大家应该就了解很多了,那我们接下来就实现代码如何?

代码实现1

struct ListNode* meet=kuai;
while(meet!=head)
{meet=meet->next;head=head->next;
}
return meet

      大家看看这个代码是很简单的吧。那只需要创建一个新节点,就是在快慢指针的节点,然后一直循环。那么他们就一定会相遇,然后就返回这个节点就可以了。关于这个代码实现,大家最主要是理解它上面的公式是如何的。

代码实现2

       我们在前面说过,这是我们返回去的第一种方法,我们还有个第二种方法。其实整体上是差不太多的。我们在他们快慢指针相遇点后创建一个新节点。然后再将快慢指针后的原节点给置为空。那么我们创建的新节点,它就是剩下链表的头节点了。加上我们原本的那个链表现在就是两个单链表了。然后就演变成了我们的另外一个问题,两个链表相交的问题。

      那么接下来我们就直接写出链表相交的问题。然后大家就可以知道了。

       我们看一下这个图。那两个单列表如果想要有交点的话,他们的尾巴是不是相同的呀?因为是单链表嘛。我们无法向前走,但我们只能从前往后走。那么我们就都往后走,一直走到尾,今天之后我们判断是否相同,如果相同,那么就代表他们肯定会有交点,如果不同,我们就返回null。 

       但大家需要注意的是我们判断的并不是他们两个的值是不相同,而是判断的地址是不相同。因为如果我们判断值的话,我们很有可能尾部的值是相同的,但地址不相同。那么这是不是就是一个问题了?所以我们判断他们尾节点是否相同的话,我们需要判断的是地址。

        我们判断了他们有交点后。我看图片也可以看出来,有的列表长,有的列表短,我们这个也是需要单独判断的呀。那么我们怎么处理这件事情呢?我们从这些链表的头一起往后走的话,很有可能会错过这个交点。但是如果我们长的和短的从相同的位置开始出发的话,那么是否就会相遇了?因为我们知道当我们链表的长度相同的话,并且他们有焦点,那么焦点的位置相同,甚至说明他们前面的不是交点的部分也是相同的。那么我们现在就是需要过滤掉长的多的那一部分。所以我们是不是比较长链表与短链表,然后提前走掉他们相差的那部分,然后再一起往后走,判断他们相交的节点了。

       并且我们也知道我们前面要计算尾节点,那我们可以在尾节点的同时计算出它们的个数,这样是不是只有就方便了许多。

void xxxx(struct list* a, struct list* b)
{struct list *cur1 = a;struct list *cur2 = b;//两个新节点int y = 0;int h = 0;//记录数字while (cur1->next){cur1 = cur1->next;y++;}while (cur2->next){cur2 = cur2->next;h++;}//走到尾节点,并且记录数if (cur1 != cur2)return NULL;//尾节点是否相同int gap = abs(y - h);struct list* max = cur1; struct list*min = cur2;if (y < h){int max = cur2; int min = cur1;}//确立谁是快指针。假设法while (gap--){max = max->next;}//快指针先走几步while (max!=min){max = max->next;min = min->next;}//一起走,然后返回节点return max;
}

       上面的代码就是第二种方法的实现方法的,大家只需要在后面传入参数的时候将节点重新创建之后然后传头节点和这个节点就可以了。 

 总结

        大家最主要的是了解这个代码的逻辑。这些代码实际上是运行起来其实没有太大的作用,最主要的是大家的逻辑能力能够得到有所锻炼,这相当于我们平常学习的有教学意义。实践的话可能没有多大作用。然后这上面就是我想与大家分享的知识了,然后肯定还有一些方法,但我不是很清楚,希望大家能在评论区里面留言。

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

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

相关文章

14 学习PID--步进电机梯形加减速实现原理

步进电机加减速使用的场景有那些呢&#xff1f;为什么要使用加减速呢&#xff1f; 硬件驱动细分器与软件的细分参数或定时器分频参数设置不当时启动电机时&#xff0c;会遇见步进电机有啸叫声但是不会转动&#xff0c;这是因为软件产生脉冲的频率大于步进电机的启动频率&#x…

java: 不兼容的类型: org.apache.xmlbeans.XmlObject无法转换为x2006.main.CTRow

我使用的xmlbeans版本是5.0&#xff0c;使用xmlbeans包做转换时&#xff0c;报错&#xff0c;正如标题显示得那样 解决办法 额外再引入下面的jar包 <dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><…

研导智能科技 简介

研导智能科技&#xff08;日照&#xff09;有限公司&#xff08;简称&#xff1a;研导智能科技&#xff09;是一家致力于人工智能与教育融合的高科技企业。公司主要开展AI辅助科研产品开发、教育培训、个性化智能教育场景空间设计与部署等业务&#xff0c;致力于通过创新的智能…

AI音乐大模型:是颠覆还是助力?

近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;AI在音乐领域的应用也日益广泛。最近一个月&#xff0c;一款名为“音乐大模型”的AI产品在音乐圈引起了广泛关注。这款产品通过深度学习技术&#xff0c;可以自动生成旋律、编曲、歌词等音乐元素&#xff0c;让素人也…

2023-2024“讯方杯”全国总决赛即将开赛,精彩一触即发!

讯方杯 2023-2024“讯方杯”全国大学生信息技术应用及创新大赛全国总决赛将于2024年6月21日一23日在广东东莞举行&#xff0c;旨在为全国高校大学生打造竞技和交流平台&#xff0c;提升学生的ICT知识水平和实践动手能力&#xff0c;助力学生迈向更高的竞赛舞台。 本次大赛由深…

《QT从基础到进阶·七十二》基于Qt开发的文件保险柜工具并支持文件各种加密和解密

1、概述 源码放在文章末尾 该项目实现了文件各种加密和解密的功能&#xff0c;能够有效的保障文件的安全&#xff0c;主要包含如下功能&#xff1a; 1、支持所有 AES 密钥长度&#xff1b; AES_128 AES_192 AES_256 2、支持ECB、CBC、CFB、OFB四种模式&#xff1b; 3、支持ZER…

微信小程序学习(二):常用样式和组件

常用样式和组件 在小程序中不能使用HTML标签&#xff0c;也就没有DOM和BOM&#xff0c;同时仅仅支持部分CSS选择器。WXML 充当的就是类似 HTML 的角色&#xff0c;只不过在 WXML 中没有div、p、 span、img、a 等标签&#xff0c;在 WXML 中需要使用 小程序提供的 view、text 、…

MyBatis的配置文件,即:src->main->resources的配置

目录 1、properties 标签 1.1 mybatis-config.xml 1.2 db.properties 1.3 在SqlMapConfig.xml 中 引入数据库配置信息 2、typeAliases 标签 2.1 定义别名 2.2 使用别名 3、Mappers标签 作用&#xff1a;用来在核心配置文件中引入映射文件 引入方式&#xff0c;有以下…

AI 已经在污染互联网了。。赛博喂屎成为现实

大家好&#xff0c;我是程序员鱼皮。这两年 AI 发展势头迅猛&#xff0c;更好的性能、更低的成本、更优的效果&#xff0c;让 AI 这一曾经高高在上的技术也走入大众的视野&#xff0c;能够被我们大多数普通人轻松使用&#xff0c;无需理解复杂的技术和原理。 其中&#xff0c;…

爆赞!24年GitHub首本Python开发实战背记手册,标星果然百万名不虚传

Python (发音:[ paiθ(ə) n; (US) paiθɔn ] n. 蟒蛇&#xff0c;巨蛇 )&#xff0c;是一种面向对象的解释性的计算机程序设计语言&#xff0c;也是一种功能强大而完善的通用型语言&#xff0c;已经具有十多年的发展历史&#xff0c;成熟且稳定。Python 具有脚本语言中最丰富…

common.js和es6中模块引入的区别?

在JavaScript中&#xff0c;CommonJS 和 ES6&#xff08;也称为ECMAScript 2015或ES2015&#xff09;都提供了模块化的功能&#xff0c;但它们之间存在一些关键的差异。以下是它们之间在模块引入方面的主要区别&#xff1a; CommonJS&#xff08;例如 Node.js&#xff09; 同步…

新火种AI|实属罕见!四大AI顶流同台,有哪些关键信息值得关注?

作者&#xff1a;小岩 编辑&#xff1a;彩云 在有着“AI春晚”之称的2024年智源大会上&#xff0c;非常难得的一幕出现了&#xff1a;当下国内的四大AI顶流公司——月之暗面&#xff0c;百川智能&#xff0c;智谱AI&#xff0c;面壁智能齐聚一堂&#xff0c;十分罕见的同台了…

软考系规论文写作万能模板

在软考高级考试中&#xff0c;论文是必须要过的坎儿。在学习软考系规《系统规划与管理师》之前首先要明白一点&#xff1a;不是教材全部学完才开始去准备论文&#xff0c;其实在学习的过程中去准备论文&#xff0c;论文的质量会更高&#xff0c;主要有以下几方面原因&#xff1…

天地图 uniapp使用笔记

官网地址&#xff1a;天地图API 效果&#xff1a; <template><view><!-- 显示地图的DOM节点 --><view id"container" class"content"></view><!-- END --><!-- 数据显示 --><h3>城市名称(IP属地)&#x…

1.MySQL---分布式系统

分布式系统中生成唯一id的方法一: 分布式唯一id 时间戳机房编号/主机编号随机因子(指字符串拼接) 如果添加商品的速度比较慢,直接使用时间戳就够了 但是如果一个时间戳内,添加了多个商品, 添加的多个商品,是落在不同的主机上的,就可以保证同一时间内,添加到不同主机的商品编…

Fisnar Liquid Control 操作维修手LC Pump Manual Twinmixer Maintenance 中文

Fisnar Liquid Control 操作维修手LC Pump Manual Twinmixer Maintenance 中文

Jquery 正则匹配字母、数字、-

Jquery 正则匹配字母、数字、- Jquery正则方式一Jquery正则方式二 本文主要讲述页面日常开发过程中需要校验输入参数时&#xff0c;采用正则校验的方式的使用方法&#xff0c;一共有两种形式&#xff0c;其中本文用到的正则公式主要是匹配字母、数字、中横线如下 Jquery正则方式…

DAY03 HTML

文章目录 一 表格1. 表格的语法2. 表格的可选标记3. 不规则的单元格&#xff08;合并单元格&#xff09;4. 表格的属性5. 表格的大小 二 列表1. 有序列表2. 无序列表3. 属性4. 列表的嵌套5. 定义列表【了解】 三 表单(重点)1. 表单的语法2. 表单的控件分类3. input元素4. selec…

智慧工地系统源码,支持项目级、公司级、集团级多级权限划分,支持PC端、手机端

智慧工地的核心是数字化&#xff0c;它通过传感器、监控设备、智能终端等技术手段&#xff0c;实现对工地各个环节的实时数据采集和传输&#xff0c;如环境温度、湿度、噪音等数据信息&#xff0c;将数据汇集到云端进行处理和分析&#xff0c;生成各种报表、图表和预警信息&…

js遍历数组的方法?有什么区别?

JavaScript 提供了多种遍历数组的方法&#xff0c;每种方法都有其特定的用途和区别。以下是一些常用的遍历数组的方法及其区别&#xff1a; for 循环 传统的遍历数组的方式可以通过索引直接访问数组元素需要手动控制循环的开始、结束和循环变量 javascript复制代码 for (let i…