플루이드의 토끼와 거북이 알고리즘은 Linked List에서 cycle 존재 유무와 cycle의 길이 및 , 시작점 을 확인할 수 있는 알고리즘으로 2개의 다른 속도로 움직이는 포인터를 사용한다. , (알고리즘 이름이 왜 토끼와 거북이인지 알 것 같다)
알고리즘은 크게 2 phase로 나뉜다. Phase 1. 다른 속도로 움직이는 두 pointer의 교차점을 찾고, Phase 2. cycle의 진입로를 찾는다.
먼저 phase 1을 세부적으로 살펴보면,
다른속도로 움직이는 두개의 pointer를 선언한다.
1 2
tortoise = head ## 한번에 하나의 노드를 이동하는 포인터 hare = head ## 한번에 두개의 노드를 이동하는 포인터
두개의 pointer의 교차점을 찾을떄까지 각 pointer를 이동시킨다.
1 2 3 4 5 6 7 8 9 10
while hare != Noneand hare.next != None: tortoise = tortoise.next; # 느린 포인터는 한번에 하나의 노드씩 이동 hare = hare.next.next; #빠른 포인터는 한번에 두개 노드씩 이동 if tortoise == hare: ## 두 포인터가 교차점을 찾으면 phase 1목표달성 return tortoise; # == intersect