这道题展开来说,就是给出一个单链表的头结点head:
1)求该链表中是否存在环路;
2)如果存在环路,求出环路的入口和环的长度。
根据单链表的性质,一个结点最多只能有一个后继,故单链表若存在环,则环一定在链表的末尾,且没有尾结点。如果一直沿着链表遍历下去,最后会在环内一直死循环。
根据以上性质,这道题的解法还是用“双指针”的思想,两个指针同时从头结点出发,但是一个指针(slow)一次走一步,另一个(fast)一次走两步,这样一来,如果链表中存在环,最后这两个结点一定会在环中相遇;若没有环,则slow一定永远不能和fast相遇。
根据以上思想,用Python实现如下:
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def is_loop(head : ListNode):
if head is None or head.next is None:
return False #空链表或只有一个结点的链表一定没有环
slow = head.next
fast = head.next.next
while fast.next is not None and fast is not None:
slow = slow.next
fast = fast.next.next
if fast is