Linked List Cycle
判断单链表是否存在环。
Description
解题思路:
一个单链表如果不存在环,则最后一个元素的下一个节点必然为null.
如果单链表存在环,则:
设置两个指针,一个慢指针和一个快指针。将链表的环想象成是一个圆形操场,两个人在同一起跑线开始绕着操场无限循环跑,那么快的人必然会再一次和慢的人相遇,即快指针的元素和慢指针的元素相同时,即说明存在环。
在代码中,慢指针设置为每次走一步,即slow=slow.next,快指针设置为每次走两步,即fast=fast.next.next。实际步数设置是可以任取的,只是循环次数不同,如可以设置fast=fast.next.next.next。
1 | # Definition for singly-linked list. |
改进:
由于每次循环都要判断是否到达最后一个节点,因此leetcode上提供了另一种思路,即采取异常的方式。
“Easier to ask for forgiveness than permission.”
1
2
3
4
5
6
7
8
9
10 def hasCycle(self, head):
try:
slow = head
fast = head.next
while slow is not fast:
slow = slow.next
fast = fast.next.next
return True
except:
return False