给定一个链表,判断它是否有环。
A: 1->5->10->11->18
↑ ↓
↑ ↓
↑ ← ← ← ←
A: 1->5->10->11->18->null
链表 A 的第五个节点 18 的 next 节点是 10,如此构成有环链表。
链表 B 则是一个无环链表。
如果链表有环,可以把有环部分看成一个跑道,有两个人,一个跑的快,一个跑的慢,如此一直跑下去,跑的快的一定会追上跑的慢的。
如果链表无环,那么跑的快的那个一定会先到达链表尾部,也就是 NULL。
我们可以设置两个指针来模拟那两个跑的快的人和跑的慢的人,一个指针每次向后移动一位,另一个指针每次向后移动两位,直到两者相遇或快指针到达链表尾部。
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/**
* @param head: The first node of linked list.
* @return: True if it has a cycle, or false
*/
public boolean hasCycle(ListNode head) {
if (head == null || head.next == null) {
return false;
}
ListNode slow = head, fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
return true;
}
}
return false;
}
}