https://oj.leetcode.com/problems/linked-list-cycle/
REF: http://blog.csdn.net/fightforyourdream/article/details/16353519
逻辑请见代码:
**
* 判断一个单链表中是否有环
* 这里也是用到两个指针。如果一个链表中有环,也就是说用一个指针去遍历,是永远走不到头的。因此,我们可以用两个指针去遍历,一个指针一次走两步
* ,一个指针一次走一步,如果有环,两个指针肯定会在环中相遇。时间复杂度为O(n)
*/
public static boolean hasCycle(Node head) {
Node slow = head; // 快指针每次前进两步
Node fast = head; // 慢指针每次前进一步
// 如果fast没有到达尾部,那么slow也不会。所以不需要判定slow是不是null
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (slow == fast) { // 相遇,存在环
return true;
}
}
return false;
}