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.