题目在这:​​https://leetcode-cn.com/problems/linked-list-cycle/​

思路分析:

注意:本题的环判断一定要看指针是否已经出现过,即指针地址值,而不是看指针所指的值是否出现过。

法一:

所以我们建立一个列表,吧指针存进去,当发现当前遍历的指针已经在列表里了。说明有环。

完整代码

def hasCycle(self, head: ListNode) -> bool:
res = []
while head:
if head in res:
return True
else:
res.append(head)
head = head.next

当然。上述方法虽然能通过leetcode。但是空间复杂度不符合题目要求。

法二:

设置一快一慢两个指针,如果有环,则两个指针一定会在后面的某个位置重合。

快指针就像汽车。慢指针就像自行车,

看图!!

力扣(leetcode) 141. 环形链表 (普通法) (快慢指针法--图解)_两个指针


完整代码:

def hasCycle(self, head: ListNode) -> bool:
fast = head
slow = head
while fast and fast.next:# 由于快指针要移动两次,所以判断。fast.next是否为空。空则没有next属性。

fast = fast.next.next
slow = slow.next
if fast == slow:
return True