Java同学的面试算法学习 6

44 阅读1分钟

判断链表中是否有环

题目描述

image-20231230181421221

思路

  • 知识点

知识点:双指针

双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个指针(特殊情况甚至可以多个),两个指针或是同方向访问两个链表、或是==同方向访问一个链表(快慢指针)==、或是==相反方向扫描(对撞指针)==,从而达到我们需要的目的。

使用快慢指针,链表如果有环,快指针就会一直循环,如果快指针变为null表示无环,有环的情况下,快指针会一直在环内循环,慢指针进入环后,由于速度不一样,两个指针一定会相撞

代码

public class Solution {
    public boolean hasCycle(ListNode head) {
        //先判断链表为空的情况
        if(head == null) 
            return false;
        //快慢双指针
        ListNode fast = head; 
        ListNode slow = head;
        //如果没环快指针会先到链表尾
        while(fast != null && fast.next != null){ 
            //快指针移动两步
            fast = fast.next.next; 
            //慢指针移动一步
            slow = slow.next; 
            //相遇则有环
            if(fast == slow) 
                return true;
        }
        //到末尾则没有环
        return false; 
    }
}