使用HashSet,从头遍历链表并写入哈希表,遍历每个元素找哈希表是否出现过,如果出现过则存在环。
HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。
HashSet 允许有 null 值。
HashSet 是无序的,即不会记录插入的顺序。
添加元素可以使用 add() 方法,add方法的返回值类型是boolean,所以如果返回值是null那么表示添加成功。
/**
* 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) {
Set<ListNode> storeSet = new HashSet<ListNode>();
while(head!=null){
if(!storeSet.add(head)){
return true;
}
head=head.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 slowPtr=head,fastPtr=head;
while(fastPtr.next!=null&&fastPtr.next.next!=null){
slowPtr=slowPtr.next;
fastPtr=fastPtr.next.next;
if(slowPtr==fastPtr){
return true;
}
}
return false;
}
}