Open In App

Detect Cycle in a Linked List using Map

Improve
Improve
Like Article
Like
Save
Share
Report

Given a Linked List, check if the linked list has a loop or not.
There are various methods shown here: Detect Cycle in Linked List

Example  

Input: 20->4->54->6->NULL 
Output: No loop is detected. 
Explanation: 
While traversing the linked list, we reach the end of the linked list. Therefore, no loop is present in the linked list.

Input: 20->4->5->10->20 
Output: Loop detected. 
Explanation: 
While traversing the linked list, reaching the node with value 10, it is linked with the head node, which depicts a loop in the linked list. Therefore, a loop is present in the linked list. 

Approach:

  1. Create a map that will store the visited node in the linked list.
  2. Traverse the linked list and do the following: 
    • Check whether the current node is present on the map or not.
    • If the current node is not present in the map then, insert the current node into the map.
    • If the Node is present in the map, the loop in a linked list is detected.
  3. If we reach the Null Node while traversing the linked list then, the given linked list has no loop present in it.

Below is the implementation of the above approach:

C++




// C++ program to detect loop in
// given linked list using map
#include <bits/stdc++.h>
using namespace std;
 
// Structure for a node in Linked List
struct Node {
    int data;
    Node* next;
};
 
// Function to create Linked List
// Node
Node* newNode(int d)
{
    Node* temp = new Node;
    temp->data = d;
    temp->next = NULL;
    return temp;
}
 
// Declaration of Map to keep
// mark of visited Node
map<Node*, bool> vis;
bool flag = 0;
 
// Function to check cycle in Linked
// List
void check(Node* head)
{
    // If head is NULL return ;
    if (head == NULL) {
        flag = 0;
        return;
    }
 
    // Mark the incoming Node as
    // visited if it is not visited yet
    if (!vis[head]) {
        vis[head] = true;
        check(head->next);
    }
 
    // If a visited Node is found
    // Update the flag value to 1
    // and return ;
    else {
        flag = 1;
        return;
    }
}
 
// Driver Code
int main()
{
    // Create a head Node
    Node* head = newNode(20);
 
    // Inserting Node in Linked List
    head->next = newNode(4);
    head->next->next = newNode(5);
    head->next->next->next = newNode(10);
 
    // Just to make a cycle
    head->next->next->next->next = head;
 
    // Function that detect cycle in
    // Linked List
    check(head);
 
    // If flag is true, loop is found
    if (flag)
        cout << "Loop detected.";
 
    // If flag is false, No Loop
    // detected
    else
        cout << "No Loop Found.";
    cout << endl;
 
    return 0;
}


Java




// Java program to detect loop in
// given linked list using map
import java.util.*;
 
class GFG{
 
// Structure for a node in Linked List
static class Node
{
    int data;
    Node next;
};
 
// Function to create Linked List
// Node
static Node newNode(int d)
{
    Node temp = new Node();
    temp.data = d;
    temp.next = null;
    return temp;
}
 
// Declaration of Map to keep
// mark of visited Node
static HashMap<Node, Boolean> vis = new HashMap<>();
static boolean flag = false;
 
// Function to check cycle in Linked
// List
static void check(Node head)
{
     
    // If head is null return ;
    if (head == null)
    {
        flag = false;
        return;
    }
 
    // Mark the incoming Node as
    // visited if it is not visited yet
    if (vis.containsKey(head))
    {
        vis.put(head, true);
        check(head.next);
    }
 
    // If a visited Node is found
    // Update the flag value to 1
    // and return ;
    else
    {
        flag = true;
        return;
    }
}
 
// Driver Code
public static void main(String[] args)
{
     
    // Create a head Node
    Node head = newNode(20);
 
    // Inserting Node in Linked List
    head.next = newNode(4);
    head.next.next = newNode(5);
    head.next.next.next = newNode(10);
 
    // Just to make a cycle
    head.next.next.next.next = head;
 
    // Function that detect cycle in
    // Linked List
    check(head);
 
    // If flag is true, loop is found
    if (flag)
        System.out.print("Loop detected.");
 
    // If flag is false, No Loop
    // detected
    else
        System.out.print("No Loop Found.");
         
    System.out.println();
}
}
 
// This code is contributed by Rajput-Ji


Python3




# Python3 program to detect loop in
# given linked list using map
 
# Structure for a node in Linked List
class Node:
    def __init__(self, val):
        self.data = val
        self.Next = None
 
# Function to create Linked List Node
def newNode(d):
    temp = Node(d)
    return temp
 
# Declaration of Map to keep
# mark of visited Node
vis = {}
flag = False
 
# Function to check cycle in Linked
# List
def check(head):
    global vis, flag
    # If head is null return ;
    if head == None:
        flag = False
        return
 
    # Mark the incoming Node as
    # visited if it is not visited yet
    if head not in vis:
        vis[head] = True
        check(head.Next)
 
    # If a visited Node is found
    # Update the flag value to 1
    # and return ;
    else:
        flag = True
        return
 
# Create a head Node
head = newNode(20)
 
# Inserting Node in Linked List
head.Next = newNode(4)
head.Next.Next = newNode(5)
head.Next.Next.Next = newNode(10)
 
# Just to make a cycle
head.Next.Next.Next.Next = head
 
# Function that detect cycle in
# Linked List
check(head)
 
# If flag is true, loop is found
if flag:
    print("Loop detected.")
 
# If flag is false, No Loop
# detected
else:
    print("No Loop Found.")
     
    # This code is contributed by suresh07.


C#




// C# program to detect loop in
// given linked list using map
using System;
using System.Collections.Generic;
 
class GFG{
 
// Structure for a node in Linked List
public class Node
{
    public int data;
    public Node next;
};
 
// Function to create Linked List
// Node
static Node newNode(int d)
{
    Node temp = new Node();
    temp.data = d;
    temp.next = null;
    return temp;
}
 
// Declaration of Map to keep
// mark of visited Node
static Dictionary<Node,
                  Boolean> vis = new Dictionary<Node,
                                                Boolean>();
static bool flag = false;
 
// Function to check cycle in Linked
// List
static void check(Node head)
{
     
    // If head is null return ;
    if (head == null)
    {
        flag = false;
        return;
    }
 
    // Mark the incoming Node as
    // visited if it is not visited yet
    if (vis.ContainsKey(head))
    {
        vis.Add(head, true);
        check(head.next);
    }
 
    // If a visited Node is found
    // Update the flag value to 1
    // and return ;
    else
    {
        flag = true;
        return;
    }
}
 
// Driver Code
public static void Main(String[] args)
{
     
    // Create a head Node
    Node head = newNode(20);
     
    // Inserting Node in Linked List
    head.next = newNode(4);
    head.next.next = newNode(5);
    head.next.next.next = newNode(10);
     
    // Just to make a cycle
    head.next.next.next.next = head;
 
    // Function that detect cycle in
    // Linked List
    check(head);
 
    // If flag is true, loop is found
    if (flag)
        Console.Write("Loop detected.");
 
    // If flag is false, No Loop
    // detected
    else
        Console.Write("No Loop Found.");
         
    Console.WriteLine();
}
}
 
// This code is contributed by gauravrajput1


Javascript




<script>
// javascript program to detect loop in
// given linked list using map
// Structure for a node in Linked List
    class Node {
        constructor(val) {
            this.data = val;
            this.next = null;
        }
    }
 
 
    // Function to create Linked List
    // Node
    function newNode(d) {
        var temp = new Node();
        temp.data = d;
        temp.next = null;
        return temp;
    }
 
    // Declaration of Map to keep
    // mark of visited Node
    var vis = new Map();;
    var flag = false;
 
    // Function to check cycle in Linked
    // List
    function check(head) {
 
        // If head is null return ;
        if (head == null) {
            flag = false;
            return;
        }
 
        // Mark the incoming Node as
        // visited if it is not visited yet
        if (!vis.has(head)) {
            vis.set(head, true);
            check(head.next);
        }
 
        // If a visited Node is found
        // Update the flag value to 1
        // and return ;
        else {
            flag = true;
            return;
        }
    }
 
    // Driver Code
     
 
        // Create a head Node
        var head = newNode(20);
 
        // Inserting Node in Linked List
        head.next = newNode(4);
        head.next.next = newNode(5);
        head.next.next.next = newNode(10);
 
        // Just to make a cycle
        head.next.next.next.next = head;
 
        // Function that detect cycle in
        // Linked List
        check(head);
 
        // If flag is true, loop is found
        if (flag)
            document.write("Loop detected.");
 
        // If flag is false, No Loop
        // detected
        else
            document.write("No Loop Found.");
 
        document.write();
 
// This code contributed by Rajput-Ji
</script>


Output: 

Loop detected.

 

Time Complexity: O(N) 
Auxiliary Space: O(N)
 



Last Updated : 09 Mar, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads