如何判断链表是否有环
给定一个单链表,判断其中是否有环,已经是一个比较老同时也是比较经典的问题,在网上搜集了一些资料,然后总结一下大概可以涉及到的问题,以及相应的解法。
首先,关于单链表中的环,一般可能涉及到以下几个问题:
1、给一个单链表,判断其中是否有环的存在;
2、如果存在环,找出环的入口点;
3、计算环的长度;
下面,我将针对上面这几个问题一一给出解释。
1、判断时候有环(链表头指针为head)
对于这个问题我们可以采用 “快慢指针” 的方法。就是有两个指针 fast 和 slow,开始的时候两个指针都指向链表头 head,然后在每一步操作中 slow 向前走一步即:slow = slow→next,而 fast 每一步向前两步即:fast = fast→next→next。
由于 fast 要比 slow 移动的快,如果有环,fast 一定会先进入环,而 slow 后进入环。当两个指针都进入环之后,经过一定步的操作之后二者一定能够在环上相遇,并且此时 slow 还没有绕环一圈,也就是说一定是在 slow 走完第一圈之前相遇。
2、找出环的入口点
当 fast 和 slow 相遇时,slow 肯定还没有走完链表,假设 fast 已经在环内循环了n(1<= n)圈。假设 slow 这时总共走了 s 步,则 fast 走了 2 * s 步;又由于 fast 走过的步数 = s + n * r(s + 在环上多走的n圈),则有下面的等式:
2 * s = s + n * r (1)
s = n * r (2)
如果假设整个链表的长度是 L,入口和相遇点的距离是 x,起点到入口点的距离是 a ,则有:
a + x = s = n * r (3)
r = L - a (4)
a + x = (n - 1) * r + r = (n - 1) * r + (L - a) (5)
a = (n - 1) * r + (L -a -x) (6)
集合式子(5)可以看出,从链表起点 head 开始到入口点的距离 a,等于从 slow 和 fast 的相遇点到入口点的距离 + (n - 1) * r 。
因此我们就可以分别用一个指针(ptr1, prt2),同时从 head 与 “slow和fast 的相遇点” 出发,每一次操作走一步,直到ptr1 == ptr2,此时的位置也就是入口点!
3、计算环的长度
根据2可以得到环的入口点,则环的长度就非常容易得到了,用一个指针在入口点出发,每一次操作走一步,直到再次回到入口点,就可以得到环的长度了!
如何判断链表是否有环相关推荐
- 判断链表是否存在环(及其延伸)
有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环. 问题: 1.如何判断一个链表是不是这类链表? 2.如果链表为存在环,如果找到环的入口点 ...
- 【刷算法】判断链表是否有环以及返回入环节点
题目描述 判断一个单链表是否有环,有环则返回入环节点,否则返回null 1->2->3->4->5->6↑ ↓8<-7 复制代码 例如上面这个链表就有环,入环节点是 ...
- 双指针算法之快慢指针(一):力扣【判断链表是否有环】leetcode-141、142
一.简介:什么是快慢指针? 快慢指针,顾名思义,无非就是设置一个快指针,一个慢指针,初始化的时候,快指针和慢指针都指向链表的头结点,前进的时候一个在前一个在后,结合起来可以十分巧妙的解决链表中的一些问 ...
- 剑指offer之判断链表是否包含环
1 问题 判断链表是否包含环 2 思路 2个指针,一个指针走一步,一个指针走2步,如果相遇则有,反之无. 3 代码实现 #include <stdio.h> #include <st ...
- 数据结构:单链表操作之如何判断链表是否带环及相关操作
//判断链表是否有环 int HasCircle(Node* pHead) { Node* low=pHead; Node* fast=pHead; while(fast != NULL &a ...
- 面试题:判断链表是否存在环
题目:判断链表是否存在环 思路:定义快慢指针,如果两个指针相遇则一定存在环. 1 public bool IsCircled(Node First) 2 { 3 if (First == null | ...
- 快慢指针判断链表是否有环
链表中很经常会出现的一个问题,判断链表是否有环,标准答案也已经烂熟于心,设置快慢指针,快指针每次走2步,慢指针每次走1步,如果两个指针可以相遇的话,证明链表有环,反之无环. 我有时候就犯嘀咕,它俩一定 ...
- 数据结构---判断链表是否有环
判断链表是否有环 判断链表是否有环 方法1 方法2 JAVA实现 问题扩展1 问题扩展2 判断链表是否有环 有一个单向链表,链表中有可能出现"环",就像下图这样.那么,如何用程序来 ...
- C程序:如何判断链表是否有环
C程序:如何判断链表是否有环 这是个常见的面试题哦,总之我面试的时候遇到过, 当时没有答上来,回去后想出来下面的方法一,该法还有个附加优点,可以判断出链表在哪个地方形成环的(即如果想拆开这个环,从哪个 ...
- 数据结构-链表(判断链表是否有环)
如何判断链表是否有环 方法1:采用快慢指针 /***************************** 函数名称:JudgmentLinkRing_1(PtrList list)* 功能描述:判断链 ...
最新文章
- 基础知识:页面div始终浮在浏览器顶部
- 英特尔公布新技术路线图,将为 AWS、高通代工芯片
- 【Android 逆向】Dalvik 函数抽取加壳 ( Dalvik 下的函数指令抽取与恢复 | dex 函数指令恢复时机点 | 类加载流程 : 加载、链接、初始化 )
- 中心频率和一些概念解释
- 阿里云openapi接口使用,PHP,视频直播
- 中高级前端面试秘籍!金三银四如何直通大厂?!(长文)
- docker from指令的含义_volume_from指令-docker撰写
- KVM console 连接虚拟机注意的位置
- 图像局部特征(十)--BRIEF描述子
- mysql怎么判断多行数据日期是否连续_MySQL学习笔记(一)
- 全网首发:LINUX右键新建时的模板问题
- HTML全面深入学习-用label获得焦点
- Coin3D三维可视化教程3
- 常用元器件及元器件封装知识
- cisco MSDP配置指南
- 装箱与拆箱(TDB)
- 路由器上网流程以及nat内网ip
- 数学归纳法求证欧几里得算法
- CompareTo和compare的区别
- 水晶报表(crystal reports)--java
热门文章
- 将音乐变成html程序,音乐变成伴奏软件 怎么把歌曲变成伴奏、消除人音
- ubuntu16.04 系统分区与安装
- AI图像照片动漫发型3D活化修复处理流量主小程序开发
- CentOS 下安装7-Zip 以及常用的解压命令
- 解压.zip.gz文件
- 曾经盛极一时的“冰箱之王”新飞电器破产!你可以输给对手,但不能败给时代
- oracle 用户和密码修改,oracle 用户解锁和修改用户密码
- html图片排列布局下面字_CSS 实现:图片+文字的布局(综合)
- IDEA之--idea同一窗口打开多个项目
- 数据库原理与应用-------简单查询(2)