如何判断单向链表有环?

原创 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就可以保证在有限次迭代后可以找出链表上的环。 

 

相关文章推荐

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

一段代码判断一个单向链表中是否有环。 下面为链表中的结构体节点 struct node {      int data;      node *next; }*linkli...

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

题目分析这是一道经典的面试题,据说还是从微软传出来的,我们来看看这个问题的通用解法——快慢指针,用两个指针pSlow和pFast,就是一个慢指针一个快指针,慢的一次向后跳一步,快的一次向后跳两步,什么...

判断单向链表中是否有环并确定开始位置

    第一个问题,判断单向链表中是否有环。网上搜到的方法,步长法,两个指针p1和p2,分别以步长1和2开始遍历链表,如果p2追上了p1,则说明存在环路。    p2每次走2步,p1每次走1步,如果没...
  • lilypp
  • lilypp
  • 2011年01月09日 01:26
  • 2295

堆排序的实现(联发科子公司创发科技笔试)及判断单向链表的环

堆排序的实现(联发科子公司创发科技笔试)及判断单向链表的环
  • guo8113
  • guo8113
  • 2014年09月26日 16:59
  • 1895

判断单向链表是否有环

1.设立2个指针i,j指向头结点 2.i走1步,j走2步.如果有环,j一定能追上i; 3.如果j不为空,且i和j相等此链表即为有环。 #include #include #include ...

单向链表判断是否有环

如何最有效的检查单向链表中是否包含了环。请避免使用额外的内存。 先给出答案吧: 定义两个指针。指针A从链表开始处每次向后移动一个节点。指针B从链表开始处每次向后移动两个节点。问题的关键是一个单...

快慢指针判断单向链表是否有环及找环入口

前言 关于快慢指针找环入口的这个问题,之前巴特跟我聊到过,印象比较深,今晚看学长在做的面试题,里面就出现了这个小知识。 发现有些东西不经意间就会用到,于是便出现此文。以后要努力做到善于总结,...

单向链表相交的第一个公共结点, 判断链表是否有环以及环的入口节点

//////题目:两个单向链表,找出它们的第一个公共结点。 ////// //////链表的结点定义为: ////// //////struct ListNode ////// //////{ ///...

josephue约瑟夫环变种 单向链表实现 (可以更改使得游戏规则动态改变)

欢迎吹毛求疵  QQ :1423173783   邮箱:1423173783@qq.com /*问题描述:有length个人坐在圆桌吃饭编号从1到length,买单的人只能是一个人,他们争着买单。为...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何判断单向链表有环?
举报原因:
原因补充:

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