如何判断单向链表有环?

原创 2007年09月22日 20:19:00

昨天去面试了一把,面试官给出了这道题。当时我知道一定有什么巧妙的办法,但是我并没有想到。我只是想到了通用的方法,顺序遍历然后为遍历过的节点依次做标志。也试图去想了些特殊的访法,不过都有一定的局限性。事后得知了下面这个较优的方案。
typedef struct NodeTag
{
   struct type data;
   node * next;
}Node;
    题目:如何判断单项链表有死循环?
    答案:定义两个指针p、q,然后让p、q同时从链表头向后查找,注意他们移动的步幅是不同的分别为a
、b,例如p指针每次执行一次【p = p->next;】q每次执行两次【q = q->next;】,如果q先到链尾【if(q->next == NULL)】则没有死循环(这里假设q比p的移动速度要快),如果p、q在此之前相遇了则有死环。

   对于这个答案少不了的还是欣赏,这确实是个good idea.但是返回来一想,会不会有这样的情况,p与q永远不会相遇呢?这里就涉及到a和b应该如何选择的问题,它们的设置必须要保证如果链表上有死环,p、q一定会在有限的步数内相遇。网上有人说a,b的只要是素数就行,有人说a、b大一点好,但a、b的值到底应该如何选择呢?
  
   分析:假设链表上有环的情况,按照前面说的方案经过了多次移动以后p和q都会上环,上环后其实就是一个追逐问题,如果a<b,且a和b距离是h,环长c。设迭代了x次后p和q相遇且相遇时q比p多跑y圈,可得出方程【ax+yc=bx+h】和【b>a】;即【x=(cy-h)/(b-a)】,注意这里的x一定要是正整数。由于c和h都是随机数,所以【(cy-h)】的结果可以是任何一个正整数。问题转变成了a和b必须满足任意整数都可以除尽【(b-a)】,这下好了终于可以得出答案:因为任意整数除以1都等于它本身。这里只要满足条件【b-a=1】 即可。也就是说p和q的步幅只要相差1就可以保证在有限次迭代后可以找出链表上的环。 

 

笔试题:判断一个单链表是否有环,如果有,找出环的起始位置

问题:判断一个单链表是否有环,如果有,找出环的起始位置。 分析: 是否有环 方法一:我们可以从单链表Head开始,每遍历一个,就把那个node放在hashset里,走到下一个的时候...
  • yuchenglian_happy
  • yuchenglian_happy
  • 2016年09月01日 09:18
  • 427

判断单链表是否有环,以及如何找起始点,环的长度

来源http://blog.csdn.net/huangxy10/article/details/8014148 判断单链表是否有环? 思路: 快慢指针,快指针每次走两步,慢指针...
  • siliang13
  • siliang13
  • 2014年10月03日 21:15
  • 910

判断单向链表中是否有环和查找环的入口

快慢指针算法描述定义两个指针slow, fast。slow指针一次走1个结点,fast指针一次走2个结点。如果链表中有环,那么慢指针一次会再某一个时刻追上快指针(slow == fast)。如果没有环...
  • tracker_w
  • tracker_w
  • 2015年08月01日 13:24
  • 3077

判断一个单向链表中是否存在环

判断一个单向链表中是否存在环
  • htyurencaotang
  • htyurencaotang
  • 2013年09月11日 13:26
  • 3344

判断一个单链表是否有环

用快慢指针法,慢指针一次走一步,快指针一次走两步,如果有环必定相遇 这里给出C++和Python 版 Python: """ Definition of ListNode class Lis...
  • susser43
  • susser43
  • 2015年04月19日 14:01
  • 995

编程之美:链表有环,如何判断相交

如果两个链表无换,判断是否相交很简单,判断两个环的最后一个节点指针是否相等即可。 题目描述:上面的问题都是针对链表无环的,那么如果现在,链表是有环的呢?上面的方法还同样有效么? 分析:如果...
  • gao1440156051
  • gao1440156051
  • 2016年06月16日 09:38
  • 803

[算法]判断一个链表是否有环

如何判断一个链表是否有环解题思路: 定义两个指针fast和slow,其中fast是快指针,slow是慢指针,二者的初始值都指向链表头,slow每前进一步,fast每次前进两步,两个指针同时向前移动...
  • CodeEmperor
  • CodeEmperor
  • 2016年05月06日 21:05
  • 1264

判断一个单链表是否有环,若有环,求进入环中的第一个节点

判断单向链表是否有环,可以采用快指针与慢指针两个指针的方式来解决。即定义一个快指针fast和一个慢指针slow,使得fast每次跳跃两个节点,slow每次跳跃一个节点。如果链表没有环的话,则slow与...
  • u013134119
  • u013134119
  • 2017年07月19日 17:23
  • 188

判断链表是否有环,如果有返回入环的第一个节点。

如何判断链表有环,这个问题很简单,有环的链表,在遍历的时候会永远在环里转下去。但如何返回入环的第一个节点,当然最简单的思路是用额外的空间记录是否访问过该节点,如果访问过,就立刻停止遍历,并返回。在《程...
  • u014422406
  • u014422406
  • 2016年12月31日 19:05
  • 299

JAVA:环链表(判断单链表是否存在环)

【题目描述】Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without ...
  • sinat_35803474
  • sinat_35803474
  • 2017年04月17日 20:52
  • 465
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何判断单向链表有环?
举报原因:
原因补充:

(最多只允许输入30个字)