如何判断链表是否有环,确定环的起点

目录

  • 判断链表是否有环
  • 如何找到环的入口

判断链表是否有环

使用快慢指针确定链表是否有环
快指针(fast) 慢指针(slow)
思路:
让快指针和慢指针从链表的起点同时走,快指针每次走两步,慢指针每次走一步,如果链表没有环,则快指针率先走出链表(走到NULL),慢指针也最终走出链表。如果链表有环,则慢指针和快指针最终会在环内相遇。

当去面试时?面试官会有如下提问?
1、为什么slow指针走一步,fast指针走两步,他们一定会在环里相遇,会不会永远追不上?请证明。
2、slow指针走一步,fast指针走3步,走4步,走n步行不行?为什么?请证明。
3、求环的入口点。

下面给图详解:

证明1:为什么slow指针走一步,fast指针走两步,他们一定会在环里相遇,会不会永远追不上?
答:不会 ,假设slow进环的时候,fast跟slow的距离是N,紧接着追击的过程中,fast往前走两步,slow往前走一步,他们每走一次,他们之间的距离就缩小1。
N
N-1
N-2
.
.
2
1
0 距离缩小到0的时候,就是相遇。

证明2: slow指针走一步,fast指针走3步,走4步,走n步行不行?为什么?
答:假设slow进环的时候,fast跟slow的距离是N,追击的过程中,fast往前3步,slow走1步,他们每走一次,他们之间的距离就缩小2
如果N是偶数,那么为一定会相遇
N
N-2
.
.
2
1
0 当N等于0时,快慢指针相遇。

如果N是奇数
N
N-2
N-4
.
.
1
-1
假设环的周长是C,两者相差距离为C-1,如过C-1是奇数,那么就永远追不上。
详解:看上图。
注意:
如果slow进环时,slow跟fast的差距N是奇数,且环的长度C是偶数,那么他们在环里就会一直打圈,永远不会相遇了。

如何找到环的入口

假设环的C长度很小,环外距离L很长,那么slow指针进环时,fast指针已经转了m圈了。
相遇时慢指针走了X步:
慢指针所走的距离为:L+X
快指针所走的距离为:L+mC+X
如果环C的长度很大,slow进环时,fast还没走完一圈。相遇时,快指针也只走了一圈,这时,快指针所走的距离为:L+C+X;
快慢指针相遇时,快指针所走距离为慢指针所走距离的两倍:
即:2
(L+X)=L+mC+X
L+X=mC
L=m
C-X
即当一个指针从相遇点开始走,一个指针,从起点开始走,当二者相遇时,就是环的入口点。具体详解,看上图。

代码
判定链表是否带环

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;
}

找到链表环的入口

struct ListNode *detectCycle(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){//相遇struct ListNode* meet=fast;while(meet!=head){meet=meet->next;head=head->next;}return meet;}}return NULL;
}

如何判断链表是否有环,确定环的起点相关推荐

  1. 判断链表是否存在环(及其延伸)

    有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环. 问题: 1.如何判断一个链表是不是这类链表? 2.如果链表为存在环,如果找到环的入口点 ...

  2. 【Java】环形链表 ( 给定一个链表,判断链表中是否有环)

    题目描述 :给你一个链表的头节点 head ,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,评测系统内部使用整数 po ...

  3. 判断链表中是否有环(环形链表)

    题意: 给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位 ...

  4. 【刷算法】判断链表是否有环以及返回入环节点

    题目描述 判断一个单链表是否有环,有环则返回入环节点,否则返回null 1->2->3->4->5->6↑ ↓8<-7 复制代码 例如上面这个链表就有环,入环节点是 ...

  5. 双指针算法之快慢指针(一):力扣【判断链表是否有环】leetcode-141、142

    一.简介:什么是快慢指针? 快慢指针,顾名思义,无非就是设置一个快指针,一个慢指针,初始化的时候,快指针和慢指针都指向链表的头结点,前进的时候一个在前一个在后,结合起来可以十分巧妙的解决链表中的一些问 ...

  6. 剑指offer之判断链表是否包含环

    1 问题 判断链表是否包含环 2 思路 2个指针,一个指针走一步,一个指针走2步,如果相遇则有,反之无. 3 代码实现 #include <stdio.h> #include <st ...

  7. 牛客题霸 判断链表中是否有环 C++题解/答案

    牛客题霸 判断链表中是否有环 C++题解/答案 题目描述 判断给定的链表中是否有环 扩展: 你能给出空间复杂度的解法么? 题解: 在这介绍一个简便的方法:快慢指针 就是:一个指针走两步,一个指针走一步 ...

  8. 数据结构:单链表操作之如何判断链表是否带环及相关操作

    //判断链表是否有环 int HasCircle(Node* pHead) { Node* low=pHead; Node* fast=pHead;     while(fast != NULL &a ...

  9. 如何判断链表有环、如何判断两个链表相交

    如何判断单链表是否存在环 有一个单向链表,链表当中有可能出现"环",就像题图这样.如何用程序判断出这个链表是有环链表? 不允许修改链表结构. 时间复杂度O(n),空间复杂度O(1) ...

  10. java工程师面试题:如何判断链表有环?

    方法一:首先从头节点开始,依次遍历单链表的每一个节点.每遍历到一个新节点,就从头节点重新遍历新节点之前的所有节点,用新节点ID和此节点之前所有节点ID依次作比较.*如果发现新节点之前的所有节点当中存在 ...

最新文章

  1. Java Excel 插入图片
  2. java 数据反射_基本操作--反射填充数据
  3. Lucene学习总结之四:Lucene索引过程分析
  4. 容器,Docker, Kubernetes和Kyma,以及Kyma对SAP的意义
  5. DP Intro - Tree DP Examples
  6. zabbix-3.0.4安装部署
  7. java半解释半编译_编译型语言、解释型语言、半编译半解释型语言
  8. linux查看java编译版本,升级linux系统中的java版本到1.8
  9. Compass的误解与新发现
  10. 【第三方软件】利用WIN8系统自带的绘图软件获取图像信息(位置和颜色信息)
  11. C#中窗体的数据传递
  12. springmvc使用rest风格的404错误
  13. cavium公司和xPliant芯片
  14. 简易检测wifi信号强度协助检测网络
  15. matlab基因频率是看最大值吗,基于ICA的语音信号盲分离
  16. 全国流通经济杂志全国流通经济杂志社全国流通经济编辑部2022年第25期目录
  17. 解决苹果电脑(Mac)无法写入移动硬盘的方法
  18. Python绝技第一章 入门 python3实现密码破解
  19. SpringBoot导入导出你会用吗?(EasyPoi)
  20. Java学习 day11 (继承与多态)接口、多态

热门文章

  1. Java杂谈来一发(九)线程状态
  2. 三国杀军争java_三国杀军争这八个武将上场就能赢,不管你是什么身份只要选他们!...
  3. 数据结构学习心得——单链表
  4. Subquery 进阶
  5. Subquery returns more than 1 row
  6. 猎豹移动:公有云快速构建海外移动化应用基础环境
  7. 《软件方法》强化自测题-分析(1)
  8. 成功经验分享,Nacos注册中心实践,带你玩转Nacos
  9. Python TensorFlow循环神经网络RNN-LSTM神经网络预测股票市场价格时间序列和MSE评估准确性
  10. [buaa-SE-2017]个人作业-回顾