- ハッシュセットを使用する方法: この方法では、リンクリストを走査しながらノードをハッシュセットに格納します。ノードを格納する前に、ハッシュセットに既に存在するかどうかを確認します。もし既に存在していれば、ループが存在すると判断します。
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
- 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
これらはリンクリストにループが存在するかどうかを検出するための一般的な方法です。他にもいくつかのアプローチがありますが、ここで紹介した方法が一般的に使用されるものです。