环形链表解析(c语言)c语言版本!自我解析(看了必会)

目录

1.判断一个表是否是环形链表!

代码如下

解析如下

2.快指针的步数和慢指针的步数有什么影响(无图解析)

3.怎么找到环形链表的入环点

代码如下

解析如下


1.判断一个表是否是环形链表!

代码如下

bool hasCycle(struct ListNode *head) {struct ListNode* fast = head;struct ListNode* slow = head;while(fast && fast->next){fast = fast->next->next;slow = slow->next;if(fast == slow){return true;}}return false;
}

解析如下

 快慢指针就是一个指针一次走好几个节点,而一个指针一次走少一点。字面意思

这里采用的是一个走两节点,一个走一个节点。

为什么要用快慢指针呢?

这个图是本题的原图,你可以用一个手指当做快指针,一个手指当做慢指针 。最终两个手指会相遇。这就是最普遍的快慢指针,fast走的是slow的路程的两倍,这就是相当于一个追击问题,再跑1000米的时候,你的好朋友的配速是你的两倍,最终他会超你一圈一个道理。

2.快指针的步数和慢指针的步数有什么影响(无图解析)

根据上面的判断,那这两个指针一定会相遇吗?

思考如果快指针一次走三,慢指针一次走一,那他们两还会相遇吗?

如果快指针走N慢指针走M呢?

 其实上面第一题 一个走两步一个走一步的方法是有一个公式的。

就以这个为例,当slow走到2的时候,fast已经走到-4,那他两距离相差1,下一次fast和slow必定相遇,因为两人每次走的距离差为1,把slow入环时两者的距离记作N,因为两者的距离差为1,N-1-1-1-1-1......N总有被减到0的时候,减到0那两者就是在一个位置,就相遇了。

那如果一个走三步的情况和一个走一步的情况呢?

这个也很好解释,假设在slow进入环的时候,fast和slow的距离为N,头结点到slow的距离为L,环的大小为C

 如果一个走三步一个走一步那两者的每次的距离差就是2.现在要让fast去追这个slow。

两者差距为N。如果每次都减2,如果N为偶数的话,那还好最终会减到0,

如果N为奇数的话最终(除了1)最终可能会减为-1,就是fast 直接超过 slow。

那最后会不会相遇呢?现在两者的距离就变成C-1了,如果C-1为偶数那接下来两个人就会碰到,

如果为奇数,那就不行了两人会再次错过吗?其实不然

 假设slow 进环时总的距离是L,期间fast就走了L+n * C - N(小n是fast走的圈数,随机值)

因为fast最终走的距离是slow 的三倍,最终可以列出等式 3L = L + n * C - N

最终 2L = n * c - N . 因为两者不相遇是因为 N 为奇数,所以N为奇数 ,2L一定是偶数。

那n * c 总的来说也必须是一个奇数,因为等式一个奇数减偶数才能等于一个偶数。

所以 c 是奇数 ,c -1 就是偶数。那说明两者不会一直不相等。最终可能会相遇。

3.怎么找到环形链表的入环点

代码如下

struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* fast = head,*slow = head;while(fast && fast->next){fast = fast->next->next;slow = slow->next;if(fast == slow){struct ListNode* cur = slow;while(cur != head){cur = cur->next;head = head->next;}return head;}}return NULL;}

解析如下

首先做这题前,我们需要画一个图

 同样假设入环点到头结点的距离为L,两者相遇的距离为X,环的大小为C

首先在slow 在入环点的时候,fast 走了 L + C * n - N 。

在slow 入环后 两者在 X 距离后相遇。

之后slow 所走的路程就变为了 L + X,fast 走的路程就是 L + n * C + X。

因为fast的路程等于slow 的两倍,所以就可以列出等式,2*(L+X) =  L + n * C + X.

解出答案后等于 L = n * C - X。这个答案的意义是什么呢?

就是L的距离等于这么fast走的这么多圈后减掉 X的距离。就是L 加上 slow 多走的环的距离,就是 fast 之前走过多少圈的环。那接下来就可以知道,其实我们可以用头指针(头结点)和慢指针的位置,每人都每次都向后走一步,最后两者就会在入环点相遇。

因为L = n * C - X,所以只要让两者相遇的点作为起点,然后向后走n 圈后,就等于L ,所以一个指针从头开始走,一个指针从 相遇点开始走,两者最终会在相遇点L 相遇。

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

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

相关文章

Windows下Oracle安装和卸载

Windows下Oracle安装和卸载 1、Windows下安装Oracle 安装的版本:win32_11gR2_database。 解压之后双击setup.exe程序。 点击是。 配置安全更新,去掉复选框,点下一步。 提示未指定电子邮件地址,点是跳过。 配置安装选项&#xf…

线性代数-Python-05:矩阵的逆+LU分解

文章目录 1 矩阵的逆1.1 求解矩阵的逆 2 初等矩阵2.1 初等矩阵和可逆性 3 矩阵的LU分解3.1 LU分解的实现 1 矩阵的逆 1.1 求解矩阵的逆 def inv(A):if A.row_num() ! A.col_num():return Nonen A.row_num()"""矩阵A单位矩阵"""ls LinearSyste…

LeetCode200.岛屿数量

看完题目我还感觉这道题目有点难,没想到20分钟不到就完全靠自己给写出来了。我就是按照自己的想法来,我用一个等大的visit数组来表示grid数组中的这个元素是否被访问过(是否已经被判断了是不是岛屿)。 先用一个大的循环对grid数组…

经典OJ题:重排链表

题目: 给定一个链表,在进行重排前: 进行重排链表后: 如上图所示,所谓的重拍链表,就是将第一个节点连接第倒数第一个节点,第二个节点连接倒数第二个节点,以此类推,最后在连…

灰度与二值化

人工智能的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心,我为大家整理了一份600多G的学习资源,基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

环境变量小节

这是写的第二篇环境变量博客,写了一年多了,第一次出现把自己博客删了的情况,不知道为什么明明发表了,然后就把草稿箱和回收站的删了,结果晚上发现没发表,回收站删除是无法找回的,以后还是要慎重…

无线充,大功率小家电,智能家居,无人机快速充电等产品供电 LDR6328S芯片TYUPE-C PD诱骗电压 USB-C解决PD电源取电问题

LDR6328S 是乐得瑞科技有限公司开发的一款兼容 USB PD、QC 和 AFC 协议的 Sink 控制器。 LDR6328S 从支持 USB PD、QC 和 AFC 协议的适配器取电,然后供电给设备。比如可以配置适配器输 出需要的功率,给无线充电器设备供电。LDR6328S 也兼容传统 USB 电源…

QT 布局管理综合实例

通过一个实例基本布局管理,演示QHBoxLayout类、QVBoxLayout类及QGridLayout类效果 本实例共用到四个布局管理器,分别是 LeftLayout、RightLayout、BottomLayout和MainLayout。 在源文件“dialog.cpp”具体代码如下: 运行效果: Se…

Unity--视觉组件(Raw Image,Mask)||Unity--视觉组件(Text,Image)

1.Raw Image 2.mask “”Raw Image:“” Texture:(纹理) 表示要显示的图像的纹理; Color:(颜色) 应用于图像的颜色; Material:(材质&#xff09…

AlGaN/GaN HFET 五参数模型

标题:A Five-Parameter Model of the AlGaN/GaN HFET 来源:IEEE TRANSACTIONS ON ELECTRON DEVICES(15年) 摘要—我们引入了AlGaN/GaN异质结场效应晶体管(HFET)漏极电流Id(Vgs,Vds…

第四节(2):修改WORD中表格数据的方案

《VBA信息获取与处理》教程(10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网…

自适应AI chatGPT智能聊天创作官网html源码/最新AI创作系统/ChatGPT商业版网站源码

源码简介: 自适应AI chatGPT智能聊天创作官网html源码,这是最新AI创作系统,作为ChatGPT商业版网站源码,它是支持创作、编写、翻译、写代码等。是一个智能聊天系统项目源码。 注意:这个只是网站html源码,要…