leetcode-141-环形链表
方法一:标记法,通过修改原有链表的值标记已经访问过。时间O(n),空间O(1)
public class Solution {
public boolean hasCycle(ListNode head) {
while(head!=null){
if(head.val==Integer.MIN_VALUE) return true;
head.val=Integer.MIN_VALUE;
head=head.next;
}
return false;
}
}
方法二:快慢指针法,如果有环的话,遍历下去将会不断重复环中节点,因此慢指针总会“追上”快指针,因为节点都是引用数据类型,所以使用==判断哈希值是否相等.时间O(n),空间O(1)
public class Solution {
public boolean hasCycle(ListNode head) {
if(head==null||head.next==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;
}
}
方法三:调用API,利用set集合不存放重复值的特性。时间O(n),空间O(n)
public class Solution {
public boolean hasCycle(ListNode head) {
HashSet<ListNode> set = new HashSet<>();
while(head!=null){
if(!set.add(head)) {
return true;
}
head=head.next;
}
return false;
}
}