题解 | #判断链表中是否有环#
判断链表中是否有环
https://www.nowcoder.com/practice/650474f313294468a4ded3ce0f7898b9
/** * 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 || 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; } }
思路很简单,定义两个指针,快慢指针,存在速度差。如果单链表,slow一直追不上fast,只能把链表走完,那就是fast为空或者fast.next为空,因为定义了fast的步长为2。如果可以追上,说明存在环。
要注意一开始head为null,或者只有一个节点的情况,一开始直接return,否则程序会越界。