题解一:
哈希表:遍历链表,如果哈希表中出现过该节点说明存在环形结构,否则将节点写入哈希表。
- import java.util.HashSet;
-
- public class Solution {
- public boolean hasCycle(ListNode head) {
- HashSet
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;
- }
- }