怎样判断一个单链表是否有环?

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

解答:

  1. 可以把遍历过的结点用一个HashSet存储起来,然后没遍历一个新节点的时候就再去和HashSet中的元素做匹配。如果HashSet中已存在该结点,那么单链表有环。假设从单链表头结点到环入口结点的距离是D,单链表的环长是S。而每一次HashSet查找元素的时间复杂度是O(1),所以总体时间复杂度是1*(D+S)=D+S,可以简单理解为O(N),而算法的空间复杂度是D+S-1,可以简单理解为O(N)。所以这个算法的时间复杂度和空间复杂度都是O(N).
  2. 第二种思路就是创建两个变量slow和fast同时指向头节点,然后slow每次向后遍历一个结点,fast每次向后遍历两个结点,如果单链表没有环的话,那么slow将永远不会追上fast,而如果单链表有环的话slow就会追上fast.这个算法的时间复杂度和空间复杂度分别是O(N)和O(1).
原文地址:https://www.cnblogs.com/techgy/p/14428385.html