给你一个链表的头节点 head
,判断链表中是否有环。
方法一:快慢指针
public class Solution {
public boolean hasCycle(ListNode head) {
// 如果head为空,或head.next为空,直接返回true
if(head ==null || head.next ==null){
return false;
}
// 快指针指向头结点的下一个节点,慢指针指向头结点
ListNode fast =head.next;
ListNode slow = head;
// while判断fast是否等于slow
while(fast != slow){
// 如果fast或fast.next为null,则没有环
if(fast ==null || fast.next ==null){
return false;
}
fast = fast.next.next;
slow = slow.next;
}
return true;
}
}
方法二:用哈希set存储
public class Solution {
public boolean hasCycle(ListNode head) {
Set<ListNode> set = new HashSet<>();
while(head != null){
// 如果set包含head,说明链表有环
if(set.contains(head)){
return true;
}
// 否则就把当前节点加到set中
set.add(head);
head = head.next;
}
return false;
}
}