链表中环的问题

问题描述:

给你一个链表的表头指针head,如何判断链表中是否有环?

扩展问题:如果有环,请找出环的入口点。

 

问题解答:

  1. 对于第一个问题,有一个很普遍的作法,就是使用快慢指针,一个指针一次走一步,另一个指针一次走两步,看是否相遇,便可以很容易得到结果。细节不再赘述。
  2. 需要仔细分析的是第二个问题,如下图所示

    假设我们的链表形状是途中所示,那么可以看出块慢指针在节点3处相遇,我们假设1到2之间的距离是x, 2到3之间的距离是y, 3到2之间的距离是z,那么我们根据快指针每次走两步的特性可以得出下列公式:

    2*(x + y) = x + y + k*(y + z)  其中k为1 , 2……

    由上面公式我们又可以推到出 x = k(y + z) - y = (k - 1)*(y + z) + z;

    即:x = (k - 1)*(y + z) + z;

    所以,后面找入口的办法是在起点(节点1)和相遇点(节点3)分别设置一个指针,然后二者每次往前一同移动一步,他们一定会在入口(节点2)处相遇。OK搞定。

posted on 2012-09-20 16:36  aho  阅读(480)  评论(2编辑  收藏  举报

导航