Cycle Detection| Linked List
TASK(medium)
A linked list is said to contain a cycle if any node is visited more than once while traversing the list. Given a pointer to the head of a linked list, determine if it contains a cycle. If it does, return 1. Otherwise, return 0.
Example
Head refers to the list of nodes
1->2->3->NULL
The numbers shown are the node numbers, not their data values. There is no cycle in this list so return 0.
head refers to the list of nodes 1->2->3->1->NULL
There is a cycle where node 3 points back to node 1, so return 1.
Function Description
Complete the has_cycle function in the editor below.
It has the following parameter:
- SinglyLinkedListNode pointer head: a reference to the head of the list
Returns
- int: 1 if there is a cycle or 0 if there is not
Note: If the list is empty, head will be null.
Input Format
The code stub reads from stdin and passes the appropriate argument to your function. The custom test cases format will not be described for this question due to its complexity. Expand the section for the main function and review the code if you would like to figure out how to create a custom case.
Constraints
0<=list size<=1000
Sample Input
References to each of the following linked lists are passed as arguments to your function:
Sample Output
0
1
SOLUTION 1
def has_cycle(head):
slow, fast = head, head
while fast and fast.next:
slow, fast = slow.next, fast.next.next
if slow == fast:
return 1
return 0
EXPLANATION STEPS
- Initialize
slow
andfast
pointers to the head. - Traverse:
- Move
slow
one step andfast
two steps. - Check if
slow
equalsfast
. If so, a cycle is detected.
- Move
- Finish:
- If
fast
reaches the end (null
), no cycle is present. - If a cycle is detected,
slow
andfast
meet inside the cycle.
- If