【编程之美】如何判断单链表里面是否有环?

来源:互联网 发布:淘宝自定义页面 编辑:程序博客网 时间:2024/05/19 08:24

1.如何判断单链表里面是否有环?

算法的思想是设定两个指针p, q,其中p每次向前移动一步,q每次向前移动两步。q肯定一直在p前面。那么如果单链表存在环,则p和q相遇;否则q将首先遇到null。

这里一个简单的理解是,p和q同时在操场跑步,其中q的速度是p的两倍,当他们两个同时出发时,p跑一圈到达起点,而q此时也刚 好跑完两圈到达起点。

2.如何判断单链表的环的长度?

这个比较简单,知道q 已经进入到环里,保存该位置。然后由该位置遍历,当再次碰到该q 位置即可,所迭代的次数就是环的长度。

3. 如何找到链表中第一个在环里的节点?

   假设链表长度是L,前半部分长度为k-1,那么第一个再环里的节点是k,环的长度是 n, 那么当q=2p时, 什么时候第一次相交呢?当q指针走到第k个节点时,q指针已经在环的第 k mod n 的位置。即p和q 相差k个元素,从不同的起点开始,则相交的位置为 n-k, 则有了下面的图:

从图上可以明显看到,当p从交点的位置(n-k) ,向前遍历k个节点就到到达环的第一个几点,节点k.

算法就很简单: 一个指针从p和q 中的第一次相交的位置起(n-k),另外一个指针从链表头开始遍历,其交点就是链表中第一个在环里的交点。

4. 如果判断两个单链表有交?第一个交点在哪里?

    这个问题画出图,就可以很容易转化为前面的题目。

    

    将其中一个链表中的尾节点与头节点联系起来,则很容发现问题转化为问题3,求有环的链表的第一个在环里的节点。


0 0
原创粉丝点击