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

news2024/11/16 21:23:38

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

单链表的题目

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

        大家可以看到这个图里面给我表示的是这个链表没有进环的地步。然后有一个竖直的黑点,就是他们环相交的地方。那么我们只需要判断是否存在这么一个点,那么就是不是能够判断是否带环了。 那么我们如何来判断他们是否有这么个点呢?然后这就是我们开始在序言中说的快慢指针的方法了。那什么叫快慢指针呢?快慢指针就是一个快,一个慢慢。例如一个指针每次走一步,一个指针每次走两步。我们以这个图为例。当慢支撑走了我的一半的话,那么快指针就已经走到他们的相交点了(就是那个黑色柱子)。当慢指针走到那个焦交点的时候,快指针已经在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.coloradmin.cn/o/1839405.html

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

相关文章

渲染农场深度解析:原理理解、配置要点与高效使用策略

许多设计领域的新手可能对“渲染农场”这一概念感到陌生。渲染农场是一种强大的计算资源集合&#xff0c;它通过高性能的CPU和GPU以及专业的渲染引擎&#xff0c;为设计项目提供必要的渲染支持。这种平台由多台计算机或渲染节点组成&#xff0c;形成一个分布式网络&#xff0c;…

统计信号处理基础 习题解答10-17

题目&#xff1a; 在选择不含信息的或者不假设任何先验知识的先验PDF时,我们需要从数据中得到最大的信息量。在这种方式下,数据是了解未知参数的主要贡献者。利用习题10.15的结果,这种方法可以通过选择使I最大的来实现。对于例10.1的高斯先验PDF,该如何选择和2使得 是不含信息…

N4中文分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊# 前言 前言 上周学习了英文文本分类&#xff0c;这次进行中文分类实战。 1. 数据读取 import pandas as pd train_data pd.read_csv(train.csv,sep\t,head…

qt.qpa.xcb: could not connect to display问题解决

1、问题描述 以服务器pi5作为远程解释器&#xff0c;本地win11使用vscode远程调试视觉时报错如下&#xff1a; qt.qpa.xcb: could not connect to display qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "xxxxx" even though it was …

室内灰尘对老人小孩危害不容忽视,资深家政推荐除灰尘空气净化器

正所谓“病从口入&#xff0c;尘从窗入”&#xff0c;室内灰尘问题不容小觑。尤其是对老人和小孩来说&#xff0c;灰尘中的有害物质更是威胁健康的重要因素。近期天气炎热&#xff0c;家家户户每天都会开窗通风&#xff0c;然而这也带来了灰尘和毛絮的问题。即使每天打扫&#…

java 线程之间通信-volatile 和 synchronized

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

LabVIEW Windows与RT系统的比较与选择

LabVIEW是一种系统设计和开发环境&#xff0c;广泛应用于各类工程和科学应用中。LabVIEW Windows和LabVIEW RT&#xff08;Real-Time&#xff09;是LabVIEW的两个主要版本&#xff0c;分别适用于不同的应用场景。以下从多个角度详细分析两者的区别&#xff0c;并提供选择建议。…

国际期货行情相关术语

1&#xff09;合约&#xff1a;期货行情表提供了期货交易的相关信息 &#xff0c;行情表中每一个期货合约都有合约代码&#xff08;由期货合约交易代码和合约到期月份组成&#xff09;来标识。 &#xff08;2&#xff09;开盘价&#xff1a;当日某一期货合约交易开始前五分钟集…

开发者配置项、开发者选项自定义

devOptions.vue源码 <!-- 开发者选项 &#xff08;CtrlAltShiftD&#xff09;--> <template><div :class"$options.name" v-if"visible"><el-dialog:custom-class"sg-el-dialog":append-to-body"true":close-on…

安装pytorch环境

安装&#xff1a;Anaconda3 通过命令行查显卡nvidia-smi 打开Anacanda prompt 新建 conda create -n pytorch python3.6 在Previous PyTorch Versions | PyTorch选择1.70&#xff0c;安装成功&#xff0c;但torch.cuda.is_available 返回false conda install pytorch1.7.0…

银行数仓项目实战(四)--了解银行业务(存款)

文章目录 项目准备存款活期定期整存整取零存整取存本取息教育储蓄定活两便通知存款 对公存款对公账户协议存款 利率 项目准备 &#xff08;贴源层不必写到项目文档&#xff0c;因为没啥操作没啥技术&#xff0c;只是数据。&#xff09; 可以看到&#xff0c;银行的贴源层并不紧…

keil MDK自动生成带版本bin文件

作为嵌入式单片机开发&#xff0c;在Keil MDK&#xff08;Microcontroller Development Kit&#xff09;中开发完编译完后&#xff0c;经常需要手动进行版本号添加用于发版&#xff0c;非常麻烦&#xff0c;如果是对外发行的话&#xff0c;更容易搞错&#xff0c;特此码哥提供一…

基于若依的ruoyi-nbcio流程管理系统增加所有任务功能(一)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

最好用的智能猫砂盆存在吗?自用分享智能猫砂盆测评!

在现代都市的忙碌生活中&#xff0c;作为一名上班族&#xff0c;经常因为需要加班或频繁出差而忙碌得不可开交。急匆匆地出门&#xff0c;却忘了给猫咪及时铲屎。但是大家要知道&#xff0c;不及时清理猫砂盆会让猫咪感到不适&#xff0c;还会引发各种健康问题&#xff0c;如泌…

无问芯穹Qllm-Eval:制作多模型、多参数、多维度的量化方案

前言 近年来&#xff0c;大语言模型&#xff08;Large Models, LLMs&#xff09;受到学术界和工业界的广泛关注&#xff0c;得益于其在各种语言生成任务上的出色表现&#xff0c;大语言模型推动了各种人工智能应用&#xff08;例如ChatGPT、Copilot等&#xff09;的发展。然而…

2021 hnust 湖科大 C语言课程设计报告+代码+流程图源文件+指导书

2021 hnust 湖科大 C语言课程设计报告代码流程图源文件指导书 目录 报告 下载链接 https://pan.baidu.com/s/14NFsDbT3iS-a-_7l0N5Ulg?pwd1111

D111FCE01LC2NB70带流量调节派克比例阀

D111FCE01LC2NB70带流量调节派克比例阀 派克比例阀&#xff1a;由于采用&#xff08;秉圣135陈工6653询3053&#xff09;电液混合控制技术&#xff0c;响应速度更快、精度更高、控制更平稳。同时&#xff0c;由于采用高质量的材料制造&#xff0c;具有较高的承压能力和抗磨损性…

生活实用口语柯桥成人外语培训机构“客服”用英文怎么说?

● 01. “客服”英语怎么说&#xff1f; ● 我们都知道“客服”就是“客户服务”&#xff0c; 所以Customer Service就是#15857575376客服的意思。 但是这里的“客服”指代的不是客服人员&#xff0c; 而是一种Service服务。 如果你想要表达客服人员可以加上具体的职位&a…

面向对象前置(java)

文章目录 环境配置相关如何在 cmd 任何路径下中 使用 javac(编译) 和 java(运行) 指令path变量的含义javac(编译&#xff09;使用java(运行&#xff09;的使用public class 和 class 的区别 标识符命名规则命名规范 字面量字符串拼接变量的作用域转移字符类型转换接收用户键盘输…

Adobe XD是否收费?试试这几款超值的免费软件吧!

Adobe XD是一站式的 UX/UI 设计平台&#xff0c;设计师可以使用Adobe XD完成移动应用app界面设计、网页设计、原型设计等。Adobe XD也是一款结合原型和设计&#xff0c;提供工业性能的跨平台设计产品。而Adobebe。 XD跨平台的特点得到了很好的弥补 Sketch 没有 Windows 版本的缺…