判断链表中是否有环
题目描述
思路
- 知识点
知识点:双指针
双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个指针(特殊情况甚至可以多个),两个指针或是同方向访问两个链表、或是==同方向访问一个链表(快慢指针)==、或是==相反方向扫描(对撞指针)==,从而达到我们需要的目的。
使用快慢指针,链表如果有环,快指针就会一直循环,如果快指针变为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;
}
}