Find length of loop/cycle in given Linked List

Given the head of a linked list. The task is to find if a loop exists in the linked list if yes then return the length of the loop in the linked list else return 0.

Examples:

Input: linked list =
Output: 4
Explanation: The loop is present in the below-linked list and the length of the loop is 4.

Input: linked list = 4 -> 3 -> 7 -> 9 -> 2
Output: 0

Recommended Practice

Approach: Below is the idea to solve the problem:

Floydâ€™s Cycle detection algorithm terminates when fast and slow pointers meet at a common point. It is also known that this common point is one of the loop nodes. Store the address of this common point in a pointer variable ptr. Then initialize a counter with 1 and start from the common point and keeps on visiting the next node and increasing the counter till the common pointer is reached again. At that point, the value of the counter will be equal to the length of the loop.

Follow the below steps to implement the idea:

• Find the common point in the loop by using the Floydâ€™s Cycle detection algorithm
• Store the pointer in a temporary variable and keep a count = 0
• Traverse the linked list until the same node is reached again and increase the count while moving to next node.
• Print the count as length of loop

Below is the implementation of the above approach:

C++

 `// C++ program to count number of nodes` `// in loop in a linked list if loop is` `// present` `#include ` `using` `namespace` `std;`   `/* Link list node */` `struct` `Node {` `    ``int` `data;` `    ``struct` `Node* next;` `};`   `// Returns count of nodes present in loop.` `int` `countNodes(``struct` `Node* n)` `{` `    ``int` `res = 1;` `    ``struct` `Node* temp = n;` `    ``while` `(temp->next != n) {` `        ``res++;` `        ``temp = temp->next;` `    ``}` `    ``return` `res;` `}`   `/* This function detects and counts loop` `   ``nodes in the list. If loop is not there` `   ``then returns 0 */` `int` `countNodesinLoop(``struct` `Node* list)` `{` `    ``struct` `Node *slow_p = list, *fast_p = list;`   `    ``while` `(slow_p && fast_p && fast_p->next) {` `        ``slow_p = slow_p->next;` `        ``fast_p = fast_p->next->next;`   `        ``/* If slow_p and fast_p meet at` `        ``some point then there is a loop */` `        ``if` `(slow_p == fast_p)` `            ``return` `countNodes(slow_p);` `    ``}`   `    ``/* Return 0 to indicate that` `       ``there is no loop*/` `    ``return` `0;` `}`   `struct` `Node* newNode(``int` `key)` `{` `    ``struct` `Node* temp` `        ``= (``struct` `Node*)``malloc``(``sizeof``(``struct` `Node));` `    ``temp->data = key;` `    ``temp->next = NULL;` `    ``return` `temp;` `}`   `// Driver Code` `int` `main()` `{` `    ``struct` `Node* head = newNode(1);` `    ``head->next = newNode(2);` `    ``head->next->next = newNode(3);` `    ``head->next->next->next = newNode(4);` `    ``head->next->next->next->next = newNode(5);`   `    ``/* Create a loop for testing */` `    ``head->next->next->next->next->next = head->next;`   `    ``cout << countNodesinLoop(head) << endl;`   `    ``return` `0;` `}`   `// This code is contributed by SHUBHAMSINGH10`

C

 `// C program to count number of nodes` `// in loop in a linked list if loop is` `// present` `#include ` `#include `   `/* Link list node */` `struct` `Node {` `    ``int` `data;` `    ``struct` `Node* next;` `};`   `// Returns count of nodes present in loop.` `int` `countNodes(``struct` `Node* n)` `{` `    ``int` `res = 1;` `    ``struct` `Node* temp = n;` `    ``while` `(temp->next != n) {` `        ``res++;` `        ``temp = temp->next;` `    ``}` `    ``return` `res;` `}`   `/* This function detects and counts loop` `   ``nodes in the list. If loop is not there` `   ``then returns 0 */` `int` `countNodesinLoop(``struct` `Node* list)` `{` `    ``struct` `Node *slow_p = list, *fast_p = list;`   `    ``while` `(slow_p && fast_p && fast_p->next) {` `        ``slow_p = slow_p->next;` `        ``fast_p = fast_p->next->next;`   `        ``/* If slow_p and fast_p meet at some point` `           ``then there is a loop */` `        ``if` `(slow_p == fast_p)` `            ``return` `countNodes(slow_p);` `    ``}`   `    ``/* Return 0 to indicate that there is no loop*/` `    ``return` `0;` `}`   `struct` `Node* newNode(``int` `key)` `{` `    ``struct` `Node* temp` `        ``= (``struct` `Node*)``malloc``(``sizeof``(``struct` `Node));` `    ``temp->data = key;` `    ``temp->next = NULL;` `    ``return` `temp;` `}`   `/* Driver program to test above function*/` `int` `main()` `{` `    ``struct` `Node* head = newNode(1);` `    ``head->next = newNode(2);` `    ``head->next->next = newNode(3);` `    ``head->next->next->next = newNode(4);` `    ``head->next->next->next->next = newNode(5);`   `    ``/* Create a loop for testing */` `    ``head->next->next->next->next->next = head->next;`   `    ``printf``(``"%d \n"``, countNodesinLoop(head));`   `    ``return` `0;` `}`

Java

 `// Java program to count number of nodes` `// in loop in a linked list if loop is` `// present` `import` `java.util.*;` `import` `java.io.*;`   `public` `class` `GFG {`   `    ``/* Link list node */` `    ``static` `class` `Node {` `        ``int` `data;` `        ``Node next;` `        ``Node(``int` `data)` `        ``{` `            ``this``.data = data;` `            ``next = ``null``;` `        ``}` `    ``}`   `    ``// Returns count of nodes present in loop.` `    ``static` `int` `countNodes(Node n)` `    ``{` `        ``int` `res = ``1``;` `        ``Node temp = n;` `        ``while` `(temp.next != n) {` `            ``res++;` `            ``temp = temp.next;` `        ``}` `        ``return` `res;` `    ``}`   `    ``/* This function detects and counts loop` `    ``nodes in the list. If loop is not there` `    ``then returns 0 */` `    ``static` `int` `countNodesinLoop(Node list)` `    ``{` `        ``Node slow_p = list, fast_p = list;`   `        ``while` `(slow_p != ``null` `&& fast_p != ``null` `               ``&& fast_p.next != ``null``) {` `            ``slow_p = slow_p.next;` `            ``fast_p = fast_p.next.next;`   `            ``/* If slow_p and fast_p meet at some point` `            ``then there is a loop */` `            ``if` `(slow_p == fast_p)` `                ``return` `countNodes(slow_p);` `        ``}`   `        ``/* Return 0 to indicate that there is no loop*/` `        ``return` `0``;` `    ``}`   `    ``static` `Node newNode(``int` `key)` `    ``{` `        ``Node temp = ``new` `Node(key);`   `        ``return` `temp;` `    ``}`   `    ``/* Driver program to test above function*/` `    ``public` `static` `void` `main(String[] args)` `    ``{` `        ``Node head = newNode(``1``);` `        ``head.next = newNode(``2``);` `        ``head.next.next = newNode(``3``);` `        ``head.next.next.next = newNode(``4``);` `        ``head.next.next.next.next = newNode(``5``);`   `        ``/* Create a loop for testing */` `        ``head.next.next.next.next.next = head.next;`   `        ``System.out.println(countNodesinLoop(head));` `    ``}` `}` `// This code is contributed by inder_verma.`

Python3

 `# Python 3 program to find the number` `# of nodes in loop in a linked list` `# if loop is present`   `# Python Code to detect a loop and` `# find the length of the loop` `# Node defining class`     `class` `Node:`   `    ``# Function to make a node` `    ``def` `__init__(``self``, val):` `        ``self``.val ``=` `val` `        ``self``.``next` `=` `None`   `# Linked List defining and loop` `# length finding class`     `class` `LinkedList:`   `    ``# Function to initialize the` `    ``# head of the linked list` `    ``def` `__init__(``self``):` `        ``self``.head ``=` `None`   `    ``# Function to insert a new` `    ``# node at the end` `    ``def` `AddNode(``self``, val):` `        ``if` `self``.head ``is` `None``:` `            ``self``.head ``=` `Node(val)` `        ``else``:` `            ``curr ``=` `self``.head` `            ``while``(curr.``next``):` `                ``curr ``=` `curr.``next` `            ``curr.``next` `=` `Node(val)`   `    ``# Function to create a loop in the` `    ``# Linked List. This function creates` `    ``# a loop by connecting the last node` `    ``# to n^th node of the linked list,` `    ``# (counting first node as 1)` `    ``def` `CreateLoop(``self``, n):`   `        ``# LoopNode is the connecting node to` `        ``# the last node of linked list` `        ``LoopNode ``=` `self``.head` `        ``for` `_ ``in` `range``(``1``, n):` `            ``LoopNode ``=` `LoopNode.``next`   `        ``# end is the last node of the Linked List` `        ``end ``=` `self``.head` `        ``while``(end.``next``):` `            ``end ``=` `end.``next`   `        ``# Creating the loop` `        ``end.``next` `=` `LoopNode`   `    ``# Function to detect the loop and return` `    ``# the length of the loop if the returned` `    ``# value is zero, that means that either` `    ``# the linked list is empty or the linked` `    ``# list doesn't have any loop` `    ``def` `detectLoop(``self``):`   `        ``# if linked list is empty then there` `        ``# is no loop, so return 0` `        ``if` `self``.head ``is` `None``:` `            ``return` `0`   `        ``# Using Floydâ€™s Cycle-Finding` `        ``# Algorithm/ Slow-Fast Pointer Method` `        ``slow ``=` `self``.head` `        ``fast ``=` `self``.head` `        ``flag ``=` `0`  `# to show that both slow and fast` `        ``# are at start of the Linked List` `        ``while``(slow ``and` `slow.``next` `and` `fast ``and` `              ``fast.``next` `and` `fast.``next``.``next``):` `            ``if` `slow ``=``=` `fast ``and` `flag !``=` `0``:`   `                ``# Means loop is confirmed in the` `                ``# Linked List. Now slow and fast` `                ``# are both at the same node which` `                ``# is part of the loop` `                ``count ``=` `1` `                ``slow ``=` `slow.``next` `                ``while``(slow !``=` `fast):` `                    ``slow ``=` `slow.``next` `                    ``count ``+``=` `1` `                ``return` `count`   `            ``slow ``=` `slow.``next` `            ``fast ``=` `fast.``next``.``next` `            ``flag ``=` `1` `        ``return` `0`  `# No loop`     `# Setting up the code` `# Making a Linked List and adding the nodes` `myLL ``=` `LinkedList()` `myLL.AddNode(``1``)` `myLL.AddNode(``2``)` `myLL.AddNode(``3``)` `myLL.AddNode(``4``)` `myLL.AddNode(``5``)`   `# Creating a loop in the linked List` `# Loop is created by connecting the` `# last node of linked list to n^th node` `# 1<= n <= len(LinkedList)` `myLL.CreateLoop(``2``)`   `# Checking for Loop in the Linked List` `# and printing the length of the loop` `loopLength ``=` `myLL.detectLoop()` `if` `myLL.head ``is` `None``:` `    ``print``(``"Linked list is empty"``)` `else``:` `    ``print``(``str``(loopLength))`   `# This code is contributed by _Ashutosh`

C#

 `// C# program to count number of nodes` `// in loop in a linked list if loop is` `// present` `using` `System;`   `class` `GFG {`   `    ``/* Link list node */` `    ``class` `Node {` `        ``public` `int` `data;` `        ``public` `Node next;` `        ``public` `Node(``int` `data)` `        ``{` `            ``this``.data = data;` `            ``next = ``null``;` `        ``}` `    ``}`   `    ``// Returns count of nodes present in loop.` `    ``static` `int` `countNodes(Node n)` `    ``{` `        ``int` `res = 1;` `        ``Node temp = n;` `        ``while` `(temp.next != n) {` `            ``res++;` `            ``temp = temp.next;` `        ``}` `        ``return` `res;` `    ``}`   `    ``/* This function detects and counts loop` `    ``nodes in the list. If loop is not there` `    ``then returns 0 */` `    ``static` `int` `countNodesinLoop(Node list)` `    ``{` `        ``Node slow_p = list, fast_p = list;`   `        ``while` `(slow_p != ``null` `&& fast_p != ``null` `               ``&& fast_p.next != ``null``) {` `            ``slow_p = slow_p.next;` `            ``fast_p = fast_p.next.next;`   `            ``/* If slow_p and fast_p meet at some point` `            ``then there is a loop */` `            ``if` `(slow_p == fast_p)` `                ``return` `countNodes(slow_p);` `        ``}`   `        ``/* Return 0 to indicate that there is no loop*/` `        ``return` `0;` `    ``}`   `    ``static` `Node newNode(``int` `key)` `    ``{` `        ``Node temp = ``new` `Node(key);`   `        ``return` `temp;` `    ``}`   `    ``/* Driver code*/` `    ``public` `static` `void` `Main(String[] args)` `    ``{` `        ``Node head = newNode(1);` `        ``head.next = newNode(2);` `        ``head.next.next = newNode(3);` `        ``head.next.next.next = newNode(4);` `        ``head.next.next.next.next = newNode(5);`   `        ``/* Create a loop for testing */` `        ``head.next.next.next.next.next = head.next;`   `        ``Console.WriteLine(countNodesinLoop(head));` `    ``}` `}`   `// This code is contributed by Rajput-Ji`

Javascript

 ``

Output

```4

```

Time complexity: O(N), Only one traversal of the linked list is needed.
Auxiliary Space: O(1), As no extra space is required.

Another Approach: Using Hash set (Unordered_set ) to keep the track of the visited nodes.

Algorithm steps:

1. Initialize an empty hash set and a pointer `current` to the head of the linked list.
2. Traverse the linked list using `current`:a. If the `current` node is already in the hash set, there is a loop:
• Initialize a variable `count` to 1 and set a pointer `startOfLoop` to the current node.
• Increment `count` and move `current` until it reaches `startOfLoop` again.
• Return `count`, which represents the number of nodes in the loop.

b. If the `current` node is not in the hash set, mark it as visited by inserting it into the hash set and move `current` to the next node.

3. If the traversal ends without finding a loop (i.e., `current` becomes nullptr), return 0 to indicate that there is no loop in the linked list.

Below is the implementation of the above approach:

C++

 `#include ` `using` `namespace` `std;`   `/* Link list node */` `struct` `Node {` `    ``int` `data;` `    ``struct` `Node* next;` `};`   `/* This function detects and counts loop` `   ``nodes in the list. If loop is not there` `   ``then returns 0 */` `int` `countNodesinLoop(``struct` `Node* list)` `{` `    ``unordered_set<``struct` `Node*> visited;` `    ``struct` `Node* current = list;` `    ``int` `count = 0;`   `    ``while` `(current != nullptr) {` `        ``// If the node is already visited, it means there is a loop` `        ``if` `(visited.find(current) != visited.end()) {` `            ``struct` `Node* startOfLoop = current;` `            ``do` `{` `                ``count++;` `                ``current = current->next;` `            ``} ``while` `(current != startOfLoop);` `            ``return` `count;` `        ``}`   `        ``// Mark the current node as visited` `        ``visited.insert(current);`   `        ``// Move to the next node` `        ``current = current->next;` `    ``}`   `    ``/* Return 0 to indicate that` `       ``there is no loop*/` `    ``return` `0;` `}`   `struct` `Node* newNode(``int` `key)` `{` `    ``struct` `Node* temp = ``new` `struct` `Node;` `    ``temp->data = key;` `    ``temp->next = nullptr;` `    ``return` `temp;` `}`   `// Driver Code` `int` `main()` `{` `    ``struct` `Node* head = newNode(1);` `    ``head->next = newNode(2);` `    ``head->next->next = newNode(3);` `    ``head->next->next->next = newNode(4);` `    ``head->next->next->next->next = newNode(5);`   `    ``/* Create a loop for testing */` `    ``head->next->next->next->next->next = head->next;`   `    ``cout << countNodesinLoop(head) << endl;`   `    ``return` `0;` `}`

Java

 `import` `java.util.HashSet;`   `// Linked list node` `class` `Node {` `    ``int` `data;` `    ``Node next;`   `    ``Node(``int` `data)` `    ``{` `        ``this``.data = data;` `        ``this``.next = ``null``;` `    ``}` `}`   `public` `class` `Main {` `    ``// Function to detect and count loop nodes in the list` `    ``static` `int` `countNodesInLoop(Node list)` `    ``{` `        ``HashSet visited = ``new` `HashSet<>();` `        ``Node current = list;` `        ``int` `count = ``0``;`   `        ``while` `(current != ``null``) {` `            ``// If the node is already visited, it means` `            ``// there is a loop` `            ``if` `(visited.contains(current)) {` `                ``Node startOfLoop = current;` `                ``do` `{` `                    ``count++;` `                    ``current = current.next;` `                ``} ``while` `(current != startOfLoop);` `                ``return` `count;` `            ``}`   `            ``// Mark the current node as visited` `            ``visited.add(current);`   `            ``// Move to the next node` `            ``current = current.next;` `        ``}`   `        ``// Return 0 to indicate that there is no loop` `        ``return` `0``;` `    ``}`   `    ``public` `static` `void` `main(String[] args)` `    ``{` `        ``Node head = ``new` `Node(``1``);` `        ``head.next = ``new` `Node(``2``);` `        ``head.next.next = ``new` `Node(``3``);` `        ``head.next.next.next = ``new` `Node(``4``);` `        ``head.next.next.next.next = ``new` `Node(``5``);`   `        ``// Create a loop for testing` `        ``head.next.next.next.next.next = head.next;`   `        ``System.out.println(countNodesInLoop(head));` `    ``}` `}`

Python3

 `class` `ListNode:` `    ``def` `__init__(``self``, val``=``0``, ``next``=``None``):` `        ``self``.val ``=` `val` `        ``self``.``next` `=` `next`   `def` `countNodesInLoop(head):` `    ``visited ``=` `set``()` `    ``current ``=` `head` `    ``count ``=` `0`   `    ``while` `current ``is` `not` `None``:` `        ``# If the node is already visited, it means there is a loop` `        ``if` `current ``in` `visited:` `            ``start_of_loop ``=` `current` `            ``while` `True``:` `                ``count ``+``=` `1` `                ``current ``=` `current.``next` `                ``if` `current ``=``=` `start_of_loop:` `                    ``break` `            ``return` `count`   `        ``# Mark the current node as visited` `        ``visited.add(current)`   `        ``# Move to the next node` `        ``current ``=` `current.``next`   `    ``# Return 0 to indicate that there is no loop` `    ``return` `0`   `# Driver Code` `if` `__name__ ``=``=` `"__main__"``:` `    ``head ``=` `ListNode(``1``)` `    ``head.``next` `=` `ListNode(``2``)` `    ``head.``next``.``next` `=` `ListNode(``3``)` `    ``head.``next``.``next``.``next` `=` `ListNode(``4``)` `    ``head.``next``.``next``.``next``.``next` `=` `ListNode(``5``)`   `    ``# Create a loop for testing` `    ``head.``next``.``next``.``next``.``next``.``next` `=` `head.``next`   `    ``print``(countNodesInLoop(head))` `    `  `# This code is contributed by akshitaguprzj3`

C#

 `using` `System;` `using` `System.Collections.Generic;`   `namespace` `Geek` `{` `    ``// Linked list node` `    ``class` `Node` `    ``{` `        ``public` `int` `data;` `        ``public` `Node next;` `    ``}` `    ``class` `GFG` `    ``{` `        ``// Function to detect and ` `        ``// count loop nodes in the list` `        ``static` `int` `CountNodesInLoop(Node list)` `        ``{` `            ``HashSet visited = ``new` `HashSet();` `            ``Node current = list;` `            ``int` `count = 0;` `            ``while` `(current != ``null``)` `            ``{` `                ``// If the node is already visited ` `                ``// it means there is a loop` `                ``if` `(visited.Contains(current))` `                ``{` `                    ``Node startOfLoop = current;` `                    ``do` `                    ``{` `                        ``count++;` `                        ``current = current.next;` `                    ``} ``while` `(current != startOfLoop);` `                    ``return` `count;` `                ``}` `                ``// Mark the current node as visited` `                ``visited.Add(current);` `                ``// Move to the next node` `                ``current = current.next;` `            ``}` `            ``// Return 0 to indicate that there is no loop` `            ``return` `0;` `        ``}` `        ``static` `Node NewNode(``int` `key)` `        ``{` `            ``Node temp = ``new` `Node();` `            ``temp.data = key;` `            ``temp.next = ``null``;` `            ``return` `temp;` `        ``}` `        ``static` `void` `Main(``string``[] args)` `        ``{` `            ``Node head = NewNode(1);` `            ``head.next = NewNode(2);` `            ``head.next.next = NewNode(3);` `            ``head.next.next.next = NewNode(4);` `            ``head.next.next.next.next = NewNode(5);` `            ``head.next.next.next.next.next = head.next;` `            ``Console.WriteLine(CountNodesInLoop(head));` `            ``// Ensure console doesn't close immediately` `            ``Console.ReadLine();` `        ``}` `    ``}` `}`

Javascript

 `// Define a class for the linked list node` `class Node {` `    ``constructor(data) {` `        ``this``.data = data;` `        ``this``.next = ``null``;` `    ``}` `}`   `// Function to count nodes in a loop (if present) in the linked list` `function` `countNodesInLoop(list) {` `    ``const visited = ``new` `Set();` `    ``let current = list;` `    ``let count = 0;`   `    ``while` `(current !== ``null``) {` `        ``// If the node is already visited, it means there is a loop` `        ``if` `(visited.has(current)) {` `            ``const startOfLoop = current;` `            ``do` `{` `                ``count++;` `                ``current = current.next;` `            ``} ``while` `(current !== startOfLoop);` `            ``return` `count;` `        ``}`   `        ``// Mark the current node as visited` `        ``visited.add(current);`   `        ``// Move to the next node` `        ``current = current.next;` `    ``}`   `    ``// Return 0 to indicate that there is no loop` `    ``return` `0;` `}`   `// Function to create a new node` `function` `newNode(key) {` `    ``const temp = ``new` `Node(key);` `    ``return` `temp;` `}`   `// Driver code` `function` `main() {` `    ``const head = newNode(1);` `    ``head.next = newNode(2);` `    ``head.next.next = newNode(3);` `    ``head.next.next.next = newNode(4);` `    ``head.next.next.next.next = newNode(5);`   `    ``// Create a loop for testing` `    ``head.next.next.next.next.next = head.next;`   `    ``console.log(countNodesInLoop(head));` `}`   `// Call the main function to test the code` `main();`

Output:

`4`

Time complexity: O(N), where N is the number of nodes in the linked list.
Auxiliary Space: O(N).

Related Articles:

This article is contributed by Shubham Gupta. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!

Previous
Next
Similar Reads
Complete Tutorials