P14-环形链表-快慢指针
//环形链表 /* * 给定一个链表,判断链表中是否有环 * 如果链表中有某个节点,可以通过连续跟踪next指针再次到达该节点,则链表中存在环 * 如果链表中存在环,返回true,否则false * */ public class P14 { static class ListNode{ int val; ListNode next; public ListNode(int val, ListNode next){ this.val = val; this.next = next; } } 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)); } private static boolean hasCycle(ListNode head) { //空间 O(n) Set<ListNode> set = new HashSet<>(); //时间 O(n) while(head != null){ //添加失败会返回false if(!set.add(head)){ return true; } head = head.next; } return false; } //双指针,快慢指针,龟兔赛跑 private static boolean hasCycle2(ListNode head) { if(head == null || head.next == null){ return false; } ListNode slow = head; ListNode quick = head.next; //时间 O(n) while(slow != quick){ if(quick == null || quick.next == null){ return false; } slow = slow.next; //走得快,同时减少遍历次数 //快指针提前进入环,迟早和慢指针相遇 quick = quick.next.next; } return true; } }