题目:
Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
题意:
给定一个单链表,然后确定在这个单链表中是否存在环?发现这道题在面试中经常会出现,因为是单链表,所以要么出现环,要么就没有出现,没有第三种情况出现。所以考虑一种方式,那就是采用类似于跑步一样,就是采用两个指针来做,首先设置一个fast指针和slow指针,然后fast指针每次走两步,而这个slow指针每次走一步,然后判断如果最后fast == slow,那么就说明存在环。也可以理解,类似于跑步跑操场,第一个人以两倍的速度和第二个人赛跑,那么最终在某一个地方,这两个人一定会相遇,也就是说第一个人一定会套圈追上第二个人;第二种情况是如果不存在环,那么无论如何,都一定不可能出现第一个人追上第二个人,也就是结束的条件就是第一个人先到达单链表的尾部。
public static boolean hasCycle(ListNode head)
{
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null) //如果有环,那么这个fast和fast的下一个指针一定不会是空
{
slow = slow.next;
fast = fast.next.next;
if(slow == fast)
break;
}
return !(fast == null || fast.next == null); //如果没有环,那么这个fast就一定会返回空,所以是false
}