leetcode URL:https://leetcode.com/problems/linked-list-cycle/
解法1 用Hashset实现,利用HashSet在add重复节点时会返回false的特性。
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public boolean hasCycle(ListNode head) {
if(head==null) return false;
HashSet<ListNode> nodeSet=new HashSet<>();
ListNode p=head;
nodeSet.add(p);
while(p.next!=null){
if(!nodeSet.add(p.next)) return true;
p=p.next;
}
return false;
}
}
解法二 快慢指针
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public boolean hasCycle(ListNode head) {
if(head==null) return false;
ListNode s=head;
ListNode f=head;
while(f!=null && f.next!=null && f.next.next!=null){//判断f.next.next是否为空之前需要先判断f和f.next是否为空,否则会NPE
s=s.next;
f=f.next.next;
if(s==f) return true;
}
return false;
}
}
注意:判断f.next.next是否为空之前需要先判断f和f.next是否为空,否则会NPE