标签:
判定的方法比较简单 有两种方法
第一种是使用哈希表来存贮每一个节点 这样的话 当hashset[ ] 中出现两个相同的节点时就可以判断出来这是一样的了 然后他所在的那个位置就是环第一次出现的位置上
第二种方法是用两个快慢指针来做
设定两个指针分别为p1 p2 , p1的移动速度为每次移动一个距离 ,而p2的移动速度为每次移动两个距离 ,这样 ,直到快指针到达链表的结尾位置
如果如果两个指针相遇的话 ,那就说明这个链表中存在环 ,没有相遇的话就没有存在环
可以想象 ,直到两个指针相遇,慢指针在环内的移动距离是不会超过环的长度 ,那极限来说 如果链表是首尾相连的 那么 慢指针的移动距离正好为连表的长度 ,如果是一个小环的话, 那么 快指针也可以在慢指针没有走满半个圆环的时间内追上慢指针。
下面来讨论如何确定初始位置的问题 设 连表起点到环的初始位置的距离为a p1和p2交点到环初始的位置为c (即p1在环内的移动距离为c) 环的长度为r 所以 对于p1来说 他所走过的路成为X = a + c 对于p2来说 他所走过的路程为 2X = a + c + k*r (k的之不确定 为自然数) 所以 x = k*r 如果让慢指针再走X步的话 他依旧会回到p1 与 p2相交的那个点 如果 让p2从连表的起点开始走的话 每次移动两个距离 移动X次 他也会走到那个交点处 这样 当p2走完a个距离之后 就会与p1重合 共同在环里绕圈 知道走到交点 所以 这样就能求出 环的初始位置了。
标签:
原文地址:http://blog.csdn.net/xws117/article/details/45398283