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
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++ program to count number of nodes // in loop in a linked list if loop is // present #include <bits/stdc++.h> 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 program to count number of nodes // in loop in a linked list if loop is // present #include <stdio.h> #include <stdlib.h> /* 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 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. |
# 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# 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 |
<script> // javascript program to count number of nodes // in loop in a linked list if loop is // present /* Link list node */
class Node { constructor(data) {
this .data = data;
this .next = null ;
}
} // Returns count of nodes present in loop.
function countNodes( n) {
var res = 1;
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
* in then returns 0
*/
function countNodesinLoop( list) {
var 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;
}
function newNode(key) {
temp = new Node(key);
return temp;
}
/* Driver program to test above function */
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;
document.write(countNodesinLoop(head));
// This code contributed by gauravrajput1 </script> |
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:
-
Initialize an empty hash set and a pointer
current
to the head of the linked list. -
Traverse the linked list using
current
:a. If thecurrent
node is already in the hash set, there is a loop:-
Initialize a variable
count
to 1 and set a pointerstartOfLoop
to the current node. -
Increment
count
and movecurrent
until it reachesstartOfLoop
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 movecurrent
to the next node. -
Initialize a variable
-
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:
#include <bits/stdc++.h> 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;
} |
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<Node> 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));
}
} |
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 |
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<Node> visited = new HashSet<Node>();
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();
}
}
} |
// 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.