Open In App

Find length of loop/cycle in given Linked List

Last Updated : 13 Sep, 2024
Summarize
Comments
Improve
Suggest changes
Like Article
Like
Share
Report
News Follow

Given the head of a linked list. The task is to find the length of the loop in the linked list. If the loop is not present return 0.

Examples:

Input: head: 25 -> 14 -> 19 -> 33 -> 10 -> 21 -> 39 ->90 ->58 -> 45 -> 33
Output: 7
Explanation: The loop is present in the below-linked list and the length of the loop is 7. 


Input: head: 4 -> 3 -> 7 -> 9 -> 2
Output: 0
Explanation: There is no loop present in the Linked List.

[Naive Approach] Using HashSet – O(n) Time and O(n) Space:

The idea is to maintain use Hashset to keep track of visited nodes so far. if the node is not present in Hashset we will insert and move to another node , else we will maintain a counter from that node and will start traversing until we reach to it again by incrementing the counter variable every time.

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 <bits/stdc++.h>
using namespace std;

class Node {
public:
    int data;
    Node* next;
    Node(int x) {
         data = x;
          next = nullptr;
    }
};

// This function detects and counts loop
// nodes in the list. If loop is not there
// then returns 0
int countNodesinLoop(Node* head) {
  
    unordered_set<Node*> visited;
    Node* current = head;
    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;
}

int main() {
      
      //create linked list 1->2->3->4->5
    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);
      
      //loop from 5 to 2
    head->next->next->next->next->next = head->next;

    cout << countNodesinLoop(head) << endl;

    return 0;
}
Java Python C# JavaScript

Output
4

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

[Expected Approach] : Using Floyd’s Cycle detection algorithm – O(n) Time and O(1) Space:

The idea is to use Floyd’s Cycle detection algorithm for detecting the common point in the loop.

  • if common point exists , increment a count variable by 1 and start traversing from that point until we reach to the node again. Return count as length of loop.
  • else return 0 , because there is no loop in linked list.

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 <bits/stdc++.h>
using namespace std;

class Node {
public:
    int data;
    Node* next;
      Node(int x) {
         data = x;
          next = nullptr;
    }
};

// Returns count of nodes present in loop.
int countNodes(Node* node) {
    int res = 1;
    Node* curr = node;
    while (curr->next != node) {
        res++;
        curr = curr->next;
    }
    return res;
}

// This function detects and counts loop
//  nodes in the list. If loop is not there
//  then returns 0 
int countNodesinLoop(Node* head) {
    Node *slow = head, *fast = head;

    while (slow != nullptr && fast != nullptr 
           && fast->next != nullptr) {
        slow = slow->next;
        fast = fast->next->next;

        // If slow and fast meet at
        // some point then there is a loop
        if (slow == fast)
            return countNodes(slow);
    }

    // Return 0 to indicate that
    //   there is no loop
    return 0;
}

int main() {
  
      // Create the linked list: 1->2->3->4->5
    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);

    //loop from 5 to 2
    head->next->next->next->next->next = head->next;
    cout << countNodesinLoop(head) << endl;

    return 0;
}
C Java Python C# JavaScript

Output
4

Time complexity: O(n), where n is the number of nodes in the Linked List.
Auxiliary Space: O(1)



Next Article
Article Tags :
Practice Tags :

Similar Reads

three90RightbarBannerImg