给定一个链表,判断链表中是否有环。
示例:
输入:head = [3,2,0,-4]
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
思路:
设定一个fast一次走两步,slow一次走一步,当fast=slow时,此时证明单链表中有环。
小思考:
本题给出的思路是fast是slow的二倍,那么请思考一下,fast可不可以是slow的三倍?四倍?甚至更多倍呢?
答案是可以的,会出现两种情况,一种是:很慢才会相遇,只不过是运算时间的不同而已;另一种情况是:永远都相遇不了。事实证明,当fast是slow的二倍的时候走的是最少的,即运算时间是最短的。
代码如下:
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast .next != null) {
fast = fast.next.next;
slow = slow.next;
if(slow == fast) {
break;
}
}
if(fast == null || fast.next == null) {
return false;
}
return true;
}
}
或者如下(两种方法思路一样):
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow) {
return true;
}
}
return false;
}
}