测试链表是否有循环的最佳算法是Floyd's Cycle-Finding Algorithm,也被称为“乌龟与兔子赛跑算法”。该算法使用两个指针,一个快指针和一个慢指针,同时遍历链表。快指针每次移动两个节点,慢指针每次移动一个节点。如果链表中存在循环,那么快指针和慢指针最终会相遇;如果链表中不存在循环,那么快指针会先到达链表的末尾。
以下是使用Floyd's Cycle-Finding Algorithm测试链表是否有循环的Python代码示例:
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def hasCycle(head: ListNode) -> bool:
slow = head
fast = head
while fast is not None and fast.next is not None:
slow = slow.next
fast = fast.next.next
if slow == fast:
return True
return False
在这个示例中,我们定义了一个ListNode
类来表示链表中的节点。hasCycle
函数接受一个链表的头节点作为参数,并返回一个布尔值,表示链表是否有循环。在函数中,我们使用两个指针slow
和fast
,分别初始化为链表的头节点。然后,我们在循环中遍历链表,每次迭代中,慢指针slow
向前移动一个节点,快指针fast
向前移动两个节点。如果链表中存在循环,那么快指针和慢指针最终会相遇,函数返回True
;否则,如果快指针到达链表的末尾,函数返回False
。
领取专属 10元无门槛券
手把手带您无忧上云