如何判断一个单链表是否有环?

如何判断一个单链表是否有环?

今天刚参加完字节游戏夏令营的面试,面试官问了我这个问题,要求空间复杂度O(1),没答上来。

虽然我凉凉了,但是我的学习不可以停滞。

不使用额外空间的办法是快慢指针。也就是用两个指针对链表进行遍历,一个慢指针,一个快指针。慢指针一次走一步,快指针一次走两步。如果二者相遇,则说明链表有环。

有些读者可能想不明白为什么这么做是正确的。

如果没有环,指针碰到null结束。快指针会比慢指针先到达null,所以不会相遇。

如果有环,慢指针没有进入环之前,快指针在环内自己空转。一旦慢指针进入了环,那么就变成了一个追及问题。因为快指针总比慢指针多走一步,所以总会追上慢指针,二者相遇。

而且二者第二次相遇时,恰好是快指针超过了慢指针一圈,可以以此来计算环的长度。

posted @ 2020-07-31 15:29  scyq  阅读(272)  评论(0编辑  收藏  举报