classSolution: defhasCycle(self, head: Optional[ListNode]) -> bool: slow = fast = head # 乌龟和兔子同时从起点出发 while fast and fast.next: slow = slow.next# 乌龟走一步 fast = fast.next.next# 兔子走两步 if fast is slow: # 兔子追上乌龟(套圈),说明有环 returnTrue returnFalse# 访问到了链表末尾,无环
classSolution(object): defdetectCycle(self, head): fast, slow = head, head whileTrue: ifnot (fast and fast.next): return fast, slow = fast.next.next, slow.next if fast == slow: break fast = head while fast != slow: fast, slow = fast.next, slow.next return fast
使用虚拟节点dummy的情况:
当你需要创造一条新链表的时候,可以使用虚拟头结点简化边界情况的处理。
何时需要切开原来的链表:
如果我们需要把原链表的节点接到新链表上,而不是 new 新节点来组成新链表的话,那么断开节点和原链表之间的链接可能是必要的。那其实我们可以养成一个好习惯,但凡遇到这种情况,就把原链表的节点断开,这样就不会出错了。