题解一:
哈希表:遍历链表,如果哈希表中出现过该节点说明存在环形结构,否则将节点写入哈希表。
import java.util.HashSet;
public class Solution {
public boolean hasCycle(ListNode head) {
HashSet<ListNode> set = new HashSet<>();
while (head != null) {
if (set.contains(head)) return true;
else set.add(head);
head = head.next;
}
return false;
}
}
题解二:
快慢指针:用两个移动速度一快一满的指针遍历链表,如果链表中不存在环形结构,则快指针会保持领先,并且先到达末尾;而如果链表中存在环形结构,则快指针会先进入环形结构,并且在环形结构中某一节点和慢指针相遇。附上官方的演示动画(来源. - 力扣(LeetCode))
import java.util.HashSet;
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode quick = head;
ListNode slow = head;
while (quick != null && quick.next != null) {
quick = quick.next.next;
slow = slow.next;
if (quick == slow) return true;
}
return false;
}
}