Answers

Question and Answer:

  Home  Microsoft

⟩ How could you determine if a linked list contains a cycle in it, and, at what node the cycle starts?

There are a number of approaches. The approach I shared is in time N (where N is the number of nodes in your linked list). Assume that the node definition contains a boolean flag, bVisited.

struct Node

{

...

bool bVisited;

};

Then, to determine whether a node has a loop, you could first set this flag to false for all of the nodes:

// Detect cycle

// Note: pHead points to the head of the list (assume already exists)

Node *pCurrent = pHead;

while (pCurrent)

{

pCurrent->bVisited = false;

pCurrent = pCurrent->pNext;

}

A much better approach was submitted by 4Guys visitor George R., a Microsoft interviewer/employee. He recommended using the following technique, which is in time O(N) and space O(1).

Use two pointers.

// error checking and checking for NULL at end of list omitted

p1 = p2 = head;

do {

p1 = p1-gt;next;

p2 = p2-gt;next->next;

} while (p1 != p2);

p2 is moving through the list twice as fast as p1. If the list is circular, (i.e. a cycle exists) it will eventually get around to that sluggard, p1.

 187 views

More Questions for you: