# Find length of loop in linked list

Write a function detectAndCountLoop() that checks whether a given Linked List contains loop and if loop is present then returns count of nodes in loop. For example, loop is present in below linked list and length of loop is 4. If loop is not present, then function should return 0.

## Recommended: Please try your approach on PRACTICE, before moving on to the solution.

We know that Floyd’s Cycle detection algorithm terminates when fast and slow pointers meet at a common point. We also know that this common point is one of the loop nodes (2 or 3 or 4 or 5 in the above diagram). We store the address of this common point in a pointer variable say ptr. Then we initialize a counter with 1 and start from the common point and keeps on visiting next node and increasing the counter till we again reach the common point(ptr). At that point, the value of the counter will be equal to the length of the loop.

## 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 ` `   ``in 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 indeciate that ther 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.io.*; ` ` `  `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  ` `in 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 indeciate that ther 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 looop 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 connnecting 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  ` `    ``in 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 indeciate that ther 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 `

Output :

`4`

Related Articles :
Detect loop in a linked list
Detect and Remove Loop in a Linked List

This article is contributed by Shubham Gupta. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

My Personal Notes arrow_drop_up

Article Tags :
Practice Tags :

5

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.