思路:使用哈希表来标记链表中的元素,如果被访问过,直接返回true,如果没有被访问过,则加入哈希表中,哈希表的特性就是同一个元素只能存入哈希表中最多一次,因此可以用来标记访问唯一性。
public class Solution {
public boolean hasCycle(ListNode head) {
//使用哈希表来判断一个元素是否被访问过
HashSet<ListNode> hasSeen = new HashSet<ListNode>();
ListNode curr = head;
while(curr!=null){
//如果已经被访问过了的话,就返回false,没有访问过的话就加入哈希表中
if(!hasSeen.add(curr)){
return true;
}
//对链表逐个检验
curr = curr.next;
}
//不存在环
return false;
}
}
方法二:快慢指针
public class Solution {
//快慢指针法(龟兔赛跑)
public boolean hasCycle(ListNode head) {
//判断极限条件,如果head == null或者head.next ==null,都无法成环
if(head == null||head.next == null){
return false;
}
ListNode slow = head;
ListNode fast = head.next;
while(slow!=fast){
//如果成环,则快慢指针在环中总会相遇的
if(fast == null||fast.next ==null){
return false;
}
slow = slow.next;
fast = fast.next.next;
}
return true;
}
}