リンクリストにループが存在するかどうかを検出する方法


  1. ハッシュセットを使用する方法: この方法では、リンクリストを走査しながらノードをハッシュセットに格納します。ノードを格納する前に、ハッシュセットに既に存在するかどうかを確認します。もし既に存在していれば、ループが存在すると判断します。
class ListNode:
    def __init__(self, val=0):
        self.val = val
        self.next = None
def has_loop(head):
    visited = set()
    current = head
    while current:
        if current in visited:
            return True
        visited.add(current)
        current = current.next
    return False
  1. 2つのポインタを使用する方法 (Floyd's Tortoise and Hare algorithm): この方法では、1つのポインタ(トータス)を1つずつ進め、もう1つのポインタ(ヘア)を2つずつ進めます。もしリンクリストにループが存在する場合、ヘアとトータスはいずれかの時点で同じノードを指すことになります。
def has_loop(head):
    if not head or not head.next:
        return False
    slow = head
    fast = head.next
    while slow != fast:
        if not fast or not fast.next:
            return False
        slow = slow.next
        fast = fast.next.next
    return True

これらはリンクリストにループが存在するかどうかを検出するための一般的な方法です。他にもいくつかのアプローチがありますが、ここで紹介した方法が一般的に使用されるものです。