算法解析:通过快慢指针判断链表是否存在环并找到环的起点
问题描述 给定一个单向链表,请判断该链表是否存在环;如果存在的话,请找到环的起点。 重要 注1:为了描述方便,后文中除非特殊指定,否则将“ 单向链表 ”简称为“ 链表 ” 注2:本文以包含头结点的链表为例,如果是一个不含头结点的链表,因为起始位置不同,所以一些变量的定义会受到影响,但不影响本文讨论的解题方法 问题分析 一般情况下,一个链表存在一个 尾结点 ,该结点的 next 指针为空。然而,当一个链表的 尾结点 指向了之前的某个前序结点时,链表就出现了“ 环 ”: 本题就是要判断一个给定的链表是否存在环,并找到环开始的位置。 注:严格来说,有环链表是没有尾结点的,因为不存在“ 最后一个结点 ”。但后文为了描述方便,仍然将指向环首结点的这个结点称为 尾结点 。 解题方案 可以通过 快慢指针 来判断一个链表是否有环。 什么是快慢指针 在一个链表的头结点处设置两个指针 slow 和 fast 并同时向前移动,规定 slow 每次移动一个结点, fast 每次移动两个结点,这就是快慢指针。 如何利用快慢指针判断链表存在环 如果链表不存在环,则肯定存在一个结点,其 next 指针为空,所以,只要 fast 在移动过程中遇到了空结点,则证明链表不存在环。 如果链表存在环,那么,因为 fast 移动速度比 slow 要快,所以,一定会在某些时刻, fast 会从后面追上 slow 。问题在于: