B站视频合集:https://www.bilibili.com/video/BV1za411n7Hf
解法一
public boolean hasCycle(ListNode head) {
Set<ListNode> set = new HashSet<>();
while (head != null) {
// if (set.contains(head))
// return true;
// set.add(head);
if (!set.add(head))
return true;
head = head.next;
}
return false;
}
解法二
public boolean hasCycle(ListNode head) {
if (head == null)
return false;
ListNode fast = head;
ListNode slow = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (slow == fast)
return true;
}
return false;// 表示没有坏
}
解法三
public boolean hasCycle(ListNode head) {
if (head == null || head.next == null)
return false;
// 如果当前节点指向自己,表示有环
if (head.next == head)
return true;
ListNode next = head.next;
// 当前节点指向自己
head.next = head;
// 继续检查下一个节点
return hasCycle(next);
}
解法四
public boolean hasCycle(ListNode head) {
if (head == null || head.next == null)
return false;
ListNode revers = reverseList(head);
return revers == head;
}
// 反转链表(这里不能使用递归的方式)
private ListNode reverseList(ListNode head) {
ListNode pre = null;// 相当于反转之后的链表
while (head != null) {
ListNode next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}