All about flooble | fun stuff | Get a free chatterbox | Free JavaScript | Avatars
 perplexus dot info

 Lost my pointer 2 (Posted on 2003-12-18)
You are given a pointer to the head of a SINGLY linked list. Write a function that takes as an argument one pointer, and determines whether or not the list is "looped".

A "looped" list means that the linked list has a node that points to a PREVIOUS member (thereby creating a cycle).

Clearly, if a list is looped, and you attempt to simply go from node to each next node until you reach the end, you will never get to an end (just going around and around the loop forever).

Conditions: The list (and the loop, if it exists) may be of any given size (up to available memory), and your function has only 64 bytes (16 4-byte pointers) of available heap/stack space).

***Extra Credit: What is the speed (big-O notation) of your solution?
__________________________________

For those of you non-computer types: a singly linked list is simply a list of records where each record (node) points to the NEXT record. (The only way to get to a node is to first be at the previous node.) The first node is special in that we keep track of where it is.

So, we can always get to the first node, but to get to the second we must first get to the first node. To get to the third, we must first get to the second, and so on.

Therefore, it is an easy matter of traversing all the nodes in order. But it is impossible to go backwards (unless one keeps track of all previously visited nodes) or to access the nodes in any other order (like random access or alphabetically).

Normally, the last node points to NULL, and we generally know to stop at that point.

This problem arises when one of the nodes MIGHT point to a node that occurred in the list previously. (For instance, the 651st node points to the 83rd node.) Then we will end up going from the 651st -> 83rd -> 84th... and continue looping.

The question is... how do we know that we've looped? (And how quickly can we determine whether or not we looped.)

 See The Solution Submitted by SilverKnight Rating: 4.0000 (2 votes)

Comments: ( Back to comment list | You must be logged in to post comments.)
 re: Racing around | Comment 8 of 22 |
(In reply to Racing around by e.g.)

This is the best solution, because it works with lists any size. The order is O(N), and you can simplify the code to

let P = first node; if P=NULL, exit
let Q = NEXT(P); if Q=NULL, exit
loop
P = NEXT(P)
Q = NEXT(Q); if Q=NULL, exit
Q = NEXT(Q); if Q=NULL, exit
until P=Q

doing away with R and a test. It should be understood that if the code exits from the middle, it means that the list actually ends; if the code finishes at the bottom, a loop was found.
 Posted by Federico Kereki on 2003-12-18 21:12:07

 Search: Search body:
Forums (0)