给定一个链表,判断链表中是否有环。
进阶:
你能否不使用额外空间解决此题?
题目分析:
链表中有环是指:1->2->3无环,1->2->3->4->3有环
查资料,得知此题用快慢指针解决,即设定两个指针,快指针一次后移2位,慢指针一次后移1位,如若有环,快指针一定会追上慢指针。
代码实现:
public static class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } public boolean hasCycle(ListNode head) { if (head == null || head.next == null) return false; ListNode slow = head; ListNode fast = head.next; while (slow != null && fast != null) { if (slow == fast) return true; slow = slow.next; if (fast.next != null) fast = fast.next.next; else return false; } return false; }
主函数:
public static void main(String[] args) { L7 l = new L7(); ListNode node1 = new ListNode(1); node1.next = new ListNode(2); node1.next.next = new ListNode(3); ListNode node2 = new ListNode(1); node2.next = new ListNode(2); node2.next.next = new ListNode(3); node2.next.next.next = new ListNode(4); node2.next.next.next.next = node2.next.next; boolean res1 = l.hasCycle(node1); boolean res2 = l.hasCycle(node2); System.out.println(res1); System.out.println(res2); }
注意在主函数中,定义环形链表的时候是:node2.next.next.next.next = node2.next.next;而不是:node2.next.next.next.next = new ListNode(3);因为用后一种赋值方式是新定义了一个节点,而不是回到了第3个节点。
运行结果:
false
true