import com.jayway.jsonpath.internal.filter.ValueNode;
import java.util.HashSet;
import java.util.Set;
public class Test4 {
//环形连表(给定一个链表 判断链表中是否有环如果链表中的某个节点,可以通过连续跟忠next指针再次达到该节点,则表中存在环,如果链表中存在环则返回true 否则返回false)
public static void main(String[] args) {
ListNode node5 = new ListNode(5,null);
ListNode node4 = new ListNode(4,node5);
ListNode node3 = new ListNode(3,node4);
ListNode node2 = new ListNode(2,node3);
ListNode node1 = new ListNode(1,node2);
//node5.next = node3;
//System.out.println(hasCycle(node1));
System.out.println(hasCycle2(node1));
}
//内部类定义链表
static class ListNode{
int val;
ListNode next;
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
//1暴力遍历
private static boolean hasCycle(ListNode head) {
//利用set的不能重复性进行判断
Set<ListNode> set = new HashSet<ListNode>();
while (head != null){
if(!set.add(head)){
return true;
}
head = head.next;
}
return false;
}
//2 双指针 -- 快慢指针
private static boolean hasCycle2(ListNode head) {
if(head == null || head.next == null){
return false;
}
ListNode slow = head;
ListNode quick = head.next;
while (slow != quick){
if(quick == null || quick.next == null){
return false;
}
slow = slow.next;
quick = quick.next.next;
}
return true;
}
}