非常简单就能理解的 链表带环问题 你也能轻松学会!

news/2025/1/13 7:39:01/

文章目录

  • 判断链表是否带环
  • 若链表带环找出环的入口
  • 其他高频的面试问题

判断链表是否带环

题目描述:

给定一个链表,判断链表中是否有环。

在这里插入图片描述

思路

可以明确的是:若一个链表带环,那么用指针一直顺着链表遍历,最终会回到某个地方。
 我们可以定义两个指针(快慢指针),两个指针均从表头开始同时遍历链表,快指针一次走两步,慢指针一次走一步。如果链表带环,那么快慢指针一定会相遇,否则快指针会先遍历完链表(遇到NULL)

 若是你不明白为什么链表带环,快慢指针就一定会相遇,那么你可以想想龟兔赛跑:
在这里插入图片描述

代码示例:

struct ListNode {int val;struct ListNode *next;
};
bool hasCycle(struct ListNode *head) {struct ListNode* slow = head;struct ListNode* fast = head;while (fast && fast->next){fast = fast->next->next;//兔子走两步slow = slow->next;//乌龟走一步if (fast == slow)//兔子与乌龟相遇return true;}return false;
}

若链表带环找出环的入口

题目描述:

给定一个链表,返回链表开始入环的第一个结点。如果链表无环,则返回NULL。

这不是一道简简单单的代码题,严格来说,这是一道数学推论题,若是不能得出最终推论,是不能很好的解决该问题的。

推论如下:

在这里插入图片描述

解释:

假设快指针走两步,慢指针走一步。头节点到入环结点距离为L,环入口结点 到快慢指针相遇结点距离为X,环的长度为C。
当快慢指针相遇,快慢指针走的距离: 慢指针:L+X 快指针:L+NC+X(N为快指针围着环走的圈数)
为什么有个N,假设环C很小,L很长,快指针可能在里面转了很多圈了。
然后就会有:2
(L+X)=L+NC+X(2倍慢指针走的距离就是快指针走的距离,因为快指针走的步数时慢指针的两倍) 所以就有:
L+X=N
C —> L=N*C-X
所以求环链表入环结点思路有:当快慢指针相遇时,让一个指针指向链表头,然后一起一个节点一个结点走,一定会在入口结点相遇。

代码示例:

struct ListNode {int val;struct ListNode *next;
};
struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* fast = head;struct ListNode* slow = head;while (fast && fast->next){slow = slow->next;//慢指针走一步fast = fast->next->next;//快指针走两步if (fast == slow)//相遇{struct ListNode* meet = fast;//相遇点while (head != meet){head = head->next;//一个指针从出发点开始走meet = meet->next;//一个指针从相遇点开始走}return meet;//两个指针相遇,返回当前结点}}return NULL;//链表不带环
}

其他高频的面试问题

问题一:为什么慢指针走一步,快指针走两步,他们一定会在环里面相遇?会不会永远追不上?请证明。

不会永远追不上,证明如下:
在这里插入图片描述

当快慢指针都进环了,假设快慢指针间的距离为N,当快慢指针走一步,他们之间的距离就缩短了1,再走一步就缩短了2…最后肯定他们之间的距离会缩短到0。

问题二:那么慢指针走一步,快指针走三步?走四步?或是走n步行不行?为什么?请证明。

不行,这样可能会追不上,证明如下:

在这里插入图片描述

解释:

假设快指针走3步,慢指针走1步。当快慢指针都进环后,假设快慢指针间的距离为N,环的周长是C,当快慢指针走一步,他们之间的距离就缩短了2,再走一步,快慢指针之间交开始的距离缩短了4。
分俩种情况:
1.若N为偶数,则他们之间的距离最终会减为0,即相遇。
2.若N为奇数,则他们之间的距离会减到1,然后减到-1,也就意味着他们之间的距离又变为了C-1,此时又分俩种情况:
1> 若C为奇数,则C-1为偶数,因为他们之间的距离一次缩小2,所有他们会相遇。
2> 若C为偶数,则C-1还是为奇数,也就是说他们之间的距离还是奇数,他们永远不会相遇。

当慢指针走一步,快指针走四步或是走n步时,证明过程类似,在此就不做赘述。


http://www.ppmy.cn/news/228816.html

相关文章

服务器hdmi如何连接显示器,容易被忽略的HDMI连接显示器的一个重要设置

书读得少真害人,令自己郁闷了三个多月的问题终于解决了。 自己冒充业余摄影爱好者多年,也懂得想学好摄影必须得有好的显示器的道理,于是在今年8月份剁手了一台戴尔的U2417H显示器,主要是看上了它的99%SRGB色域以及色准(这个价位好…

weex android 图标,U乐网址 -官网

要不是最近换了工作的原因,我觉得我根本没有可能去用MSN,这部微软的老爷车99年开始发布到现在已经有10几个年头了,这么多年一直没有什么进 步却还能一直活着,这的确是一个奇迹.12年底,微软证实2013年第一季度Skype将替代Windows Live Messenger,而Windows Live Messenger将停止…

大步小步算法模板题, poj2417

大步小步模板 &#xff08;hash稍微有一点麻烦, poj不支持C11略坑&#xff09; #include <iostream> #include <vector> #include <cstring> #include <cstdio> #include <cmath> #include <map> #define pb push_back #define fi first #…

POJ 2417 Discrete Logging【大步小步

裸的BSGS 安利这个blog&#xff0c;我觉得讲得很靠谱 顺便BSGS真的不用求逆元&#xff0c;既然可以设xkab&#xff0c;不如直接设成xka-b&#xff0c;乘到那边就完事了 不用求但是还是要用到逆元的思想 以上 #include<cstdio> #include<algorithm> #include&l…

学习使用常用的windbg命令(u、dt、ln、x)(转)

详细 &#xff08;1&#xff09;u命令&#xff08;反汇编&#xff09; &#xff08;2&#xff09;dt命令&#xff08;查看数据结构&#xff09; &#xff08;3&#xff09;ln命令&#xff08;查找就近的符号&#xff09; &#xff08;4&#xff09;x命令&#xff08;显示模…

真机读取u盘里面的图片并显示

做了很久的相册功能&#xff0c;真不容易&#xff0c;边做边学&#xff0c;而且还没有做完&#xff0c;因为想从ec换成as&#xff0c;所以在as downloads的时候我就先把过程中的一些问题和知识点先记下来。 首先&#xff0c;项目中使用了&#xff0c;aidl&#xff0c;官方解释是…

linux PC进不了pe 引导,【U盘模式无法引导进入pe系统】u盘启动无法进入pe系统_电脑无法进入pe系统-系统城...

2016-04-20 19:06:49  浏览量:4304 使用U盘PE装系统已经非常流行,特别是在电脑无法启动时,可以通过U盘PE给电脑重新安装系统,那么要怎么进入U盘PE系统呢?下面系统城小编就教大家怎么用U盘进入PE系统的方法。 2017-03-01 17:01:06  浏览量:10974 pe是装系统最常用到的…

poj2417: bsgs算法模板

bsgs算法用来解决有关A^x ≡ B (mod C)的方程, 求x 把x看成 i*m-j&#xff0c;上面的式子就可以变成A^(i * m - j) ≡ B (mod C) > A^(i * m) ≡ B * A^j (mod C) 具体解释看这个&#xff1a;https://blog.csdn.net/clover_hxy/article/details/50683832 这个博客是…