方法一:
public class Solution {
public boolean hasCycle(ListNode head) {
if(head==null || head.next==null){
return false;
}
ListNode slow=head;
ListNode fast=head.next;
while(slow!=fast){
if(fast==null || fast.next==null){
return false;
}
slow=slow.next;
fast=fast.next.next;
}
return true;
}
}
方法二:
public class Solution {
public boolean hasCycle(ListNode head) {
Set<ListNode> nodesSeen=new HashSet<>();
while(head!=null){
if(nodesSeen.contains(head)){
return true;
}else{
nodesSeen.add(head);
}
head=head.next;
}
return false;
}
}
注意:
- 当需要标记时,要学会使用HashSet
- HashSet的contains()方法
- 向HashSet中添加数据的add方法
补充HashSet知识:
HashSet是set接口的实现类:HashSet类是Set接口的典型实现类不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变,它们的hashCode()方法返回值不相等, HashSet将会把它们存储在不同的位置, 依然可以添加成功。
HashSet不是同步的。
方法摘要:
- add(E e):如果此 set 中尚未包含指定元素,则添加指定元素。
- clear(): 从此 set 中移除所有元素。
- clone():返回此 HashSet 实例的浅表副本:并没有复制这些元素本身。
- contains(Object o): 如果此 set 包含指定元素,则返回 true。
- isEmpty():如果此 set 不包含任何元素,则返回 true。
- Iterator iterator():返回对此 set 中元素进行迭代的迭代器。
- remove(Object o):如果指定元素存在于此 set 中,则将其移除。
- size():返回此 set 中的元素的数量(set 的容量)。
package com.xt.set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class FunctionTest {
public static void main(String[] args) {
Set<String> names = new HashSet<>();//jdk7.0后实例化时<>中可以不加
//HashSet变量.add("嗷嗷"):把嗷嗷加入到集合中
names.add("张三");
names.add("李四");
//遍历方法不能用传统遍历方法,因为HashSet类中没有get方法
//第一种遍历方法:加强for循环
for (String name : names) {
System.out.println(name);
}
//第二种遍历方法:迭代器遍历
Iterator<String> iterator = names.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
//HashSet变量.clear():清除所有的数据
names.clear();
//HashSet变量.idEmpty(): 判断是否为空
System.out.println(names.isEmpty());
}
}