题目:判断链表是否存在环

思路:定义快慢指针,如果两个指针相遇则一定存在环。

 1    public bool IsCircled(Node First)
 2         {
 3             if (First == null || First.Next == null)
 4             {
 5                 return false;
 6             }
 7             else
 8             {
 9                 Node slow = First;
10                 Node fast = First;
11                 while (fast != null && fast.Next != null)
12                 {
13                     fast = fast.Next.Next;
14                     slow = slow.Next;
15                     if (slow == fast)
16                     {
17                         break;
18                     }
19
20                 }
21                 if (fast == null || fast.Next == null)
22                 {
23                     return false;
24                 }
25                 else return true;
26             }
27         }

拓展1

求环的长度:

思路:从快慢指针第一次相遇开始计数,再次相遇时停止计数。

 1   public int GetloopLength(Node First)
 2         {
 3             if (First == null && First.Next == null) return 0;
 4             else
 5             {
 6                 Node slow = First;
 7                 Node fast = First;
 8                 int length = 0;
 9                 bool start = false;
10                 bool again = false;
11                 while (fast != null && fast.Next != null)
12                 {
13                     fast = fast.Next.Next;
14                     slow = slow.Next;
15                     if (fast == slow && again == true)
16                     {
17                         break;
18                     }
19                     if (fast == slow && again == false)
20                     {
21                         start = true;
22                         again = true;
23                     }
24                     if (start == true)
25                     {
26                         length++;
27                     }
28                 }
29                 return length;
30             }
31         }

拓展2

求环的入口:

思路:头结点到入口点的距离=链表总长-环长

 1  public Node FindLoopEntrance(Node First)
 2         {
 3             if (First == null || First.Next == null) return null;
 4             else
 5             {
 6                 int sumLength = 0;
 7                 int loopLength = 0;
 8                 Node slow = First;
 9                 Node fast = First;
10                 bool start = false;
11                 bool again = false;
12
13                 while (fast != null && fast.Next != null)
14                 {
15                     fast = fast.Next.Next;
16                     slow = slow.Next;
17                     if (fast == slow && again == true) break;
18                     if (fast == slow && again == false)
19                     {
20                         start = true;
21                         again = true;
22                     }
23                     if (start == true) loopLength++;
24                     sumLength++;
25                 }
26                 int indexOfEntrance = sumLength - 2 * loopLength;
27                 int i = 0;
28                 Node entrance = First;
29                 while (entrance.Next != null)
30                 {
31                     if (indexOfEntrance == i) break;
32                     entrance = entrance.Next;
33                     i++;
34                 }
35                 return entrance;
36             }
37         }

转载于:https://www.cnblogs.com/hehe625/p/7779393.html

面试题:判断链表是否存在环相关推荐

  1. PHP面试高频算法面试题 -- 判断链表是否有环

    题目:给定一个链表,判断链表中是否有环. 关联力扣141题目 https://leetcode-cn.com/problems/linked-list-cycle/ 题解: PHP题解 functio ...

  2. 面试题——判断链表是否有环

    题目描述 给定一链表,判断是否有环(有环是指最后一个结点的指针指向链表中的某个结点,构成一个循环),若有,则输出环的入口,若无,输出NULL. 结论1:若链表有环,从同一结点出发的两个指针,走得快的一 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. spark读取hdfs路径下的数据_Spark读取HDFS数据分区参考
  2. 实现php a标签文件,HTML_如何点击a标签实现弹出input file上传文件对话框,html 复制代码代码如下: SPAN - phpStudy...
  3. UA OPTI570 量子力学32 参考系与绘景
  4. 时间序列python复杂网络实例_基于时间序列数据的复杂网络重构
  5. 错误提示“未能加载文件或程序集“Microsoft.Office.Interop.Owc11”,
  6. 太强了!这个 Jupyter notebook 离线工具可以用一辈子!
  7. mysql子查询sysdate_Oracle向MySQL 迁移相关事项
  8. mvc路由 html,asp.net-mvc – ASP.NET MVC路由从html页面开始
  9. oracle和mysql数据实时同步_异构数据源的CDC实时同步系统——最终选型实战
  10. r语言ggplot2一夜多图_ggplot2绘图:多张图合并为一张
  11. 基于图结构的图合成与差分隐私【LDPGen】
  12. 如何将外链接向内连接转换?
  13. 无法进入页面,且浏览器调试界面->Timing报CAUTION:request is not finished yet!
  14. 【ABAP系列】SAP ABAP的事件执行顺序
  15. 在函数内对带副作用的运算符 rand 的使用无效。_如何成体系掌握Excel函数(一)...
  16. Android开发 入门篇(一)
  17. CAN通讯程序C语言,基于单片机的CANBUS程序(C语言)
  18. 建立民间贷款集资合法化
  19. js将数字的金额转换成中文大写金额
  20. USB-Blaster驱动安装失败 Code 39

热门文章

  1. 解决eclipse报PermGen space内存溢出异常的问题
  2. 【测试】禅道搭建在服务器上的操作步骤
  3. 一次线上事故,让我对MySql的时间戳存char(10)还是int(10)有了全新的认识
  4. R语言 支持向量机分类预测
  5. FTP文件传输协议介绍和常用命令
  6. 程序员不满薪资拒绝offer,HR怒称:估计你一辈子就是个程序员了!
  7. ucosii 如何确定定时器的时间_全国中小学寒假时间确定,家长如何安排孩子们假期更合理?...
  8. python3 logging模块_python3中使用logging模块写日志,中文乱码,如何解决?
  9. Java教程:Java程序的运行过程(执行流程)分析
  10. JavaScript是什么?JavaScript简介