/**
* 自己的代码,快慢指针,如果fast到null说明无环,fast和slow相遇说明有环
* Runtime: 0 ms, faster than 100.00%
* Memory Usage: 40.1 MB, less than 33.80%
*/
// 写法一
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode slow = head, fast = head;
while (fast != null) {
fast = fast.next;
if (fast == null)
return false;
fast = fast.next;
slow = slow.next;
if (fast == slow)
return true;
}
return false;
}
}
// 写法二
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode fast = head, slow = head;
do {
if (fast == null)
return false;
fast = fast.next;
if (fast == null)
return false;
fast = fast.next;
slow = slow.next;
} while (fast != slow);
return true;
}
}
/**
* discuss里看到的做法,很特别
* 指针遍历链表,每遍历一个节点就将这个节点修改(将next指针指向自己)
* 读到某一个节点如果next指针指向了自己,说明读到的是已经走过的节点(或者头节点就是这样),说明有环
* 最好不要用,破坏了原始链表
*/
// recursive,0ms,40.1MB
public class Solution {
public boolean hasCycle(ListNode head) {
if (head == null || head.next == null)
return false;
if (head.next == head)
return true;
ListNode nextNode = head.next;
head.next = head;
return hasCycle(nextNode);
}
}
// non-recursive,0ms,41MB
public class Solution {
public boolean hasCycle(ListNode head) {
while (head != null) {
ListNode nextNode = head.next;
if (nextNode == head)
return true;
head.next = head;
head = nextNode;
}
return false;
}
}