给定一个单链表,判断其中是否有环,已经是一个比较老同时也是比较经典的问题,在网上搜集了一些资料,然后总结一下大概可以涉及到的问题,以及相应的解法。

首先,关于单链表中的环,一般可能涉及到以下几个问题:

  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可以得到环的入口点,则环的长度就非常容易得到了,用一个指针在入口点出发,每一次操作走一步,直到再次回到入口点,就可以得到环的长度了!

如何判断链表是否有环相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 面试题:判断链表是否存在环

    题目:判断链表是否存在环 思路:定义快慢指针,如果两个指针相遇则一定存在环. 1 public bool IsCircled(Node First) 2 { 3 if (First == null | ...

  7. 快慢指针判断链表是否有环

    链表中很经常会出现的一个问题,判断链表是否有环,标准答案也已经烂熟于心,设置快慢指针,快指针每次走2步,慢指针每次走1步,如果两个指针可以相遇的话,证明链表有环,反之无环. 我有时候就犯嘀咕,它俩一定 ...

  8. 数据结构---判断链表是否有环

    判断链表是否有环 判断链表是否有环 方法1 方法2 JAVA实现 问题扩展1 问题扩展2 判断链表是否有环 有一个单向链表,链表中有可能出现"环",就像下图这样.那么,如何用程序来 ...

  9. C程序:如何判断链表是否有环

    C程序:如何判断链表是否有环 这是个常见的面试题哦,总之我面试的时候遇到过, 当时没有答上来,回去后想出来下面的方法一,该法还有个附加优点,可以判断出链表在哪个地方形成环的(即如果想拆开这个环,从哪个 ...

  10. 数据结构-链表(判断链表是否有环)

    如何判断链表是否有环 方法1:采用快慢指针 /***************************** 函数名称:JudgmentLinkRing_1(PtrList list)* 功能描述:判断链 ...

最新文章

  1. 基础知识:页面div始终浮在浏览器顶部
  2. 英特尔公布新技术路线图,将为 AWS、高通代工芯片
  3. 【Android 逆向】Dalvik 函数抽取加壳 ( Dalvik 下的函数指令抽取与恢复 | dex 函数指令恢复时机点 | 类加载流程 : 加载、链接、初始化 )
  4. 中心频率和一些概念解释
  5. 阿里云openapi接口使用,PHP,视频直播
  6. 中高级前端面试秘籍!金三银四如何直通大厂?!(长文)
  7. docker from指令的含义_volume_from指令-docker撰写
  8. KVM console 连接虚拟机注意的位置
  9. 图像局部特征(十)--BRIEF描述子
  10. mysql怎么判断多行数据日期是否连续_MySQL学习笔记(一)
  11. 全网首发:LINUX右键新建时的模板问题
  12. HTML全面深入学习-用label获得焦点
  13. Coin3D三维可视化教程3
  14. 常用元器件及元器件封装知识
  15. cisco MSDP配置指南
  16. 装箱与拆箱(TDB)
  17. 路由器上网流程以及nat内网ip
  18. 数学归纳法求证欧几里得算法
  19. CompareTo和compare的区别
  20. 水晶报表(crystal reports)--java

热门文章

  1. 将音乐变成html程序,音乐变成伴奏软件 怎么把歌曲变成伴奏、消除人音
  2. ubuntu16.04 系统分区与安装
  3. AI图像照片动漫发型3D活化修复处理流量主小程序开发
  4. CentOS 下安装7-Zip 以及常用的解压命令
  5. 解压.zip.gz文件
  6. 曾经盛极一时的“冰箱之王”新飞电器破产!你可以输给对手,但不能败给时代
  7. oracle 用户和密码修改,oracle 用户解锁和修改用户密码
  8. html图片排列布局下面字_CSS 实现:图片+文字的布局(综合)
  9. IDEA之--idea同一窗口打开多个项目
  10. 数据库原理与应用-------简单查询(2)