一、检测单链表中存在环
① 环的定义
- 单链表中结点都是一个结点指向下一个结点这样一个一个链接起来的,直到尾结点的指针域没有指向,单链表就到此结束。
- 链表有环的定义是,链表的尾结点的指针域并为空,指向了链接中间的某个结点,这样就形成环,遍历单链表就会死循环,这是因为破坏了结束条件。
- 如下所示:如果单链表有环,则在遍历时,在通过结点 J 之后,会重新回到结点 D:
② 快慢指针检测
- 设两个工作指针,一个快一个慢,如果有环的话,它们会必然在某点相遇。
- 算法的思想是:设定使用两个指针,fast 与 slow,它们起始都位于链表的头部。随后,slow 指针每次向后移动一个位置,而 fast 指针向后移动两个位置。如果链表中存在环,则 fast 指针最终将再次与 slow 指针在环中相遇。
- 如下图所示,设链表中环外部分的长度为 a。slow 指针进入环后,又走了 b 的距离与 fast 相遇。此时,fast 指针已经走完了环的 n 圈,因此它走过的总距