public boolean hasCycle(Node root){
Node tortoise = root;
Node hare = tortoise.next;
while (hare != tortoise) {
// tortoise moves one place
tortoise = tortoise.next;
// hare moves two places
hare = hare.next;
if (hare != null) {
hare = hare.next;
}
if (tortoise == null || hare == null) {
// end of list, no cycles
return false;
}
}
return true;
}
(This is an interview question.)
Monday, June 14, 2010
Detecting a Cycle in Linked List
How do you detect a cycle in a linked list? A cycle occurs if one node points back to a previous node in the list. You could solve this by using an intermediary data structure, but a more efficient algorithm is Floyd's "hare and tortoise" algorithm.
The idea is to have two iterators; the hare and the tortoise. The hare runs along the list faster than the tortoise and if the list has a cycle, the hare will eventually overtake the tortoise. The following code illustrates the algorithm:
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.