Keywords
floyd (1) tortoise and hare (1)
Permissions
Viewable by Everyone
Editable by All Siafoo Users

Floyd's Cycle Detection Algorithm (The Tortoise and the Hare) 0

 In Brief How do you determine if your singly-linked list has a cycle? In the late 1960s, Robert W. Floyd invented an algorithm that worked in linear (O(N)) time. It is also called Floyd's cycle detection algorithm.... more
 Performance Bound
 Implementation Difficulty
1 tortoise = top
2 hare = top
3
4 forever:
5 if hare == end :
6 return 'No Loop Found'
7 hare = hare.next
8
9 if hare == end :
10 return 'No Loop Found'
11 hare = hare.next
12
13 tortoise = tortoise.next
14
15 if hare == tortoise:
16 return 'Loop Found'

How do you determine if your singly-linked list has a cycle? In the late 1960s, Robert W. Floyd invented an algorithm that worked in linear (O(N)) time. It is also called Floyd's cycle detection algorithm.

The easiest solution to the cycle detection problem is to run through the list, keeping track of which nodes you visit, and on each node check to see if it is the same as any of the previous nodes. It's pretty obvious that this runs in quadratic (O(N^2)) time... not very efficient, and actually more complicated than this one.

The Tortoise and the Hare is possibly the most famous cycle detection algorithm, and is surprisingly straightforward. The Tortoise and the Hare are both pointers, and both start at the top of the list. For each iteration, the Tortoise takes one step and the Hare takes two. If there is a loop, the hare will go around that loop (possibly more than once) and eventually meet up with the turtle when the turtle gets into the loop. If there is no loop, the hare will get to the end of the list without meeting up with the turtle.

Why can't you just let the hare go by itself? If there was a loop, it would just go forever; the turtle ensues you will only take n steps at most.

For a somewhat more efficient algorithm, check out Brent's Cycle Detection Algorithm (The Teleporting Turtle).