Given a linked list, check if the linked list has a loop (cycle) or not. The below diagram shows a linked list with a loop.

Linked List with Loop
Detect loop in a linked list using Hashing:
The idea is to insert the nodes in the hashmap and whenever a node is encountered that is already present in the hashmap then return true.
Follow the steps below to solve the problem:
- Traverse the list individually and keep putting the node addresses in a Hash Table.
- At any point, if NULL is reached then return false
- If the next of the current nodes points to any of the previously stored nodes in Hash then return true.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
struct Node* next;
};
void push( struct Node** head_ref, int new_data)
{
struct Node* new_node = new Node;
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
bool detectLoop( struct Node* h)
{
unordered_set<Node*> s;
while (h != NULL) {
if (s.find(h) != s.end())
return true ;
s.insert(h);
h = h->next;
}
return false ;
}
int main()
{
struct Node* head = NULL;
push(&head, 20);
push(&head, 4);
push(&head, 15);
push(&head, 10);
head->next->next->next->next = head;
if (detectLoop(head))
cout << "Loop Found" ;
else
cout << "No Loop" ;
return 0;
}
|
Java
import java.util.*;
public class LinkedList {
static Node head;
static class Node {
int data;
Node next;
Node( int d)
{
data = d;
next = null ;
}
}
static public void push( int new_data)
{
Node new_node = new Node(new_data);
new_node.next = head;
head = new_node;
}
static boolean detectLoop(Node h)
{
HashSet<Node> s = new HashSet<Node>();
while (h != null ) {
if (s.contains(h))
return true ;
s.add(h);
h = h.next;
}
return false ;
}
public static void main(String[] args)
{
LinkedList llist = new LinkedList();
llist.push( 20 );
llist.push( 4 );
llist.push( 15 );
llist.push( 10 );
llist.head.next.next.next.next = llist.head;
if (detectLoop(head))
System.out.println( "Loop Found" );
else
System.out.println( "No Loop" );
}
}
|
Python3
class Node:
def __init__( self , data):
self .data = data
self . next = None
class LinkedList:
def __init__( self ):
self .head = None
def push( self , new_data):
new_node = Node(new_data)
new_node. next = self .head
self .head = new_node
def printList( self ):
temp = self .head
while (temp):
print (temp.data, end = " " )
temp = temp. next
def detectLoop( self ):
s = set ()
temp = self .head
while (temp):
if (temp in s):
return True
s.add(temp)
temp = temp. next
return False
llist = LinkedList()
llist.push( 20 )
llist.push( 4 )
llist.push( 15 )
llist.push( 10 )
llist.head. next . next . next . next = llist.head
if (llist.detectLoop()):
print ( "Loop Found" )
else :
print ( "No Loop " )
|
C#
using System;
using System.Collections.Generic;
class LinkedList {
public Node head;
public class Node {
public int data;
public Node next;
public Node( int d)
{
data = d;
next = null ;
}
}
public void push( int new_data)
{
Node new_node = new Node(new_data);
new_node.next = head;
head = new_node;
}
public static bool detectLoop(Node h)
{
HashSet<Node> s = new HashSet<Node>();
while (h != null ) {
if (s.Contains(h))
return true ;
s.Add(h);
h = h.next;
}
return false ;
}
public static void Main(String[] args)
{
LinkedList llist = new LinkedList();
llist.push(20);
llist.push(4);
llist.push(15);
llist.push(10);
llist.head.next.next.next.next = llist.head;
if (detectLoop(llist.head))
Console.WriteLine( "Loop Found" );
else
Console.WriteLine( "No Loop" );
}
}
|
Javascript
<script>
var head;
class Node {
constructor(val) {
this .data = val;
this .next = null ;
}
}
function push(new_data) {
var new_node = new Node(new_data);
new_node.next = head;
head = new_node;
}
function detectLoop(h) {
var s = new Set();
while (h != null ) {
if (s.has(h))
return true ;
s.add(h);
h = h.next;
}
return false ;
}
push(20);
push(4);
push(15);
push(10);
head.next.next.next.next = head;
if (detectLoop(head))
document.write( "Loop Found" );
else
document.write( "No Loop" );
</script>
|
Time complexity: O(N), Only one traversal of the loop is needed.
Auxiliary Space: O(N), N is the space required to store the value in the hashmap.
Detect loop in a linked list by Modification In Node Structure:
The idea is to modify the node structure by adding flag in it and mark the flag whenever visit the node.
Follow the steps below to solve the problem:
- Have a visited flag with each node.
- Traverse the linked list and keep marking visited nodes.
- If you see a visited node again then there is a loop.
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
struct Node* next;
int flag;
};
void push( struct Node** head_ref, int new_data)
{
struct Node* new_node = new Node;
new_node->data = new_data;
new_node->flag = 0;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
bool detectLoop( struct Node* h)
{
while (h != NULL) {
if (h->flag == 1)
return true ;
h->flag = 1;
h = h->next;
}
return false ;
}
int main()
{
struct Node* head = NULL;
push(&head, 20);
push(&head, 4);
push(&head, 15);
push(&head, 10);
head->next->next->next->next = head;
if (detectLoop(head))
cout << "Loop Found" ;
else
cout << "No Loop" ;
return 0;
}
|
C
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
int flag;
} Node;
void push( struct Node** head_ref, int new_data)
{
struct Node* new_node = (Node*) malloc ( sizeof (Node));
new_node->data = new_data;
new_node->flag = 0;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
bool detectLoop( struct Node* h)
{
while (h != NULL) {
if (h->flag == 1)
return true ;
h->flag = 1;
h = h->next;
}
return false ;
}
int main()
{
struct Node* head = NULL;
push(&head, 20);
push(&head, 4);
push(&head, 15);
push(&head, 10);
head->next->next->next->next = head;
if (detectLoop(head))
printf ( "Loop Found" );
else
printf ( "No Loop" );
return 0;
}
|
Java
import java.util.*;
class GFG {
static class Node {
int data;
Node next;
int flag;
};
static Node push(Node head_ref, int new_data)
{
Node new_node = new Node();
new_node.data = new_data;
new_node.flag = 0 ;
new_node.next = head_ref;
head_ref = new_node;
return head_ref;
}
static boolean detectLoop(Node h)
{
while (h != null ) {
if (h.flag == 1 )
return true ;
h.flag = 1 ;
h = h.next;
}
return false ;
}
public static void main(String[] args)
{
Node head = null ;
head = push(head, 20 );
head = push(head, 4 );
head = push(head, 15 );
head = push(head, 10 );
head.next.next.next.next = head;
if (detectLoop(head))
System.out.print( "Loop Found" );
else
System.out.print( "No Loop" );
}
}
|
Python3
class Node:
def __init__( self ):
self .data = 0
self . next = None
self .flag = 0
def push(head_ref, new_data):
new_node = Node()
new_node.data = new_data
new_node.flag = 0
new_node. next = (head_ref)
(head_ref) = new_node
return head_ref
def detectLoop(h):
while (h ! = None ):
if (h.flag = = 1 ):
return True
h.flag = 1
h = h. next
return False
if __name__ = = '__main__' :
head = None
head = push(head, 20 )
head = push(head, 4 )
head = push(head, 15 )
head = push(head, 10 )
head. next . next . next . next = head
if (detectLoop(head)):
print ( "Loop Found" )
else :
print ( "No Loop" )
|
C#
using System;
class GFG {
class Node {
public int data;
public Node next;
public int flag;
};
static Node push(Node head_ref, int new_data)
{
Node new_node = new Node();
new_node.data = new_data;
new_node.flag = 0;
new_node.next = head_ref;
head_ref = new_node;
return head_ref;
}
static bool detectLoop(Node h)
{
while (h != null ) {
if (h.flag == 1)
return true ;
h.flag = 1;
h = h.next;
}
return false ;
}
public static void Main( string [] args)
{
Node head = null ;
head = push(head, 20);
head = push(head, 4);
head = push(head, 15);
head = push(head, 10);
head.next.next.next.next = head;
if (detectLoop(head))
Console.Write( "Loop Found" );
else
Console.Write( "No Loop" );
}
}
|
Javascript
<script>
class Node
{
constructor()
{
let data;
let next;
let flag;
}
}
function push( head_ref, new_data)
{
let new_node = new Node();
new_node.data = new_data;
new_node.flag = 0;
new_node.next = head_ref;
head_ref = new_node;
return head_ref;
}
function detectLoop(h)
{
while (h != null )
{
if (h.flag == 1)
return true ;
h.flag = 1;
h = h.next;
}
return false ;
}
let head = null ;
head = push(head, 20);
head = push(head, 4);
head = push(head, 15);
head = push(head, 10);
head.next.next.next.next = head;
if (detectLoop(head))
document.write( "Loop Found" );
else
document.write( "No Loop" );
</script>
|
Time complexity: O(N), Only one traversal of the loop is needed.
Auxiliary Space: O(1)
This algorithm is used to find a loop in a linked list. It uses two pointers one moving twice as fast as the other one. The faster one is called the faster pointer and the other one is called the slow pointer.
Follow the steps below to solve the problem:
- Traverse linked list using two pointers.
- Move one pointer(slow_p) by one and another pointer(fast_p) by two.
- If these pointers meet at the same node then there is a loop. If pointers do not meet then the linked list doesn’t have a loop.
Illustration:
The below image shows how the detect loop function works in the code:

Implementation of Floyd’s Cycle-Finding Algorithm:
C++
#include <bits/stdc++.h>
using namespace std;
class Node {
public :
int data;
Node* next;
};
void push(Node** head_ref, int new_data)
{
Node* new_node = new Node();
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
int detectLoop(Node* list)
{
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 == fast_p) {
return 1;
}
}
return 0;
}
int main()
{
Node* head = NULL;
push(&head, 20);
push(&head, 4);
push(&head, 15);
push(&head, 10);
head->next->next->next->next = head;
if (detectLoop(head))
cout << "Loop Found" ;
else
cout << "No Loop" ;
return 0;
}
|
C
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
void push( struct Node** head_ref, int new_data)
{
struct Node* new_node
= ( struct Node*) malloc ( sizeof ( struct Node));
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
int detectLoop( 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 == fast_p) {
return 1;
}
}
return 0;
}
int main()
{
struct Node* head = NULL;
push(&head, 20);
push(&head, 4);
push(&head, 15);
push(&head, 10);
head->next->next->next->next = head;
if (detectLoop(head))
printf ( "Loop Found" );
else
printf ( "No Loop" );
return 0;
}
|
Java
import java.io.*;
class LinkedList {
Node head;
class Node {
int data;
Node next;
Node( int d)
{
data = d;
next = null ;
}
}
public void push( int new_data)
{
Node new_node = new Node(new_data);
new_node.next = head;
head = new_node;
}
void detectLoop()
{
Node slow_p = head, fast_p = head;
int flag = 0 ;
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 == fast_p) {
flag = 1 ;
break ;
}
}
if (flag == 1 )
System.out.println( "Loop Found" );
else
System.out.println( "No Loop" );
}
public static void main(String args[])
{
LinkedList llist = new LinkedList();
llist.push( 20 );
llist.push( 4 );
llist.push( 15 );
llist.push( 10 );
llist.head.next.next.next.next = llist.head;
llist.detectLoop();
}
}
|
Python
class Node:
def __init__( self , data):
self .data = data
self . next = None
class LinkedList:
def __init__( self ):
self .head = None
def push( self , new_data):
new_node = Node(new_data)
new_node. next = self .head
self .head = new_node
def printList( self ):
temp = self .head
while (temp):
print (temp.data)
temp = temp. next
def detectLoop( self ):
slow_p = self .head
fast_p = self .head
while (slow_p and fast_p and fast_p. next ):
slow_p = slow_p. next
fast_p = fast_p. next . next
if slow_p = = fast_p:
return 1
return 0
llist = LinkedList()
llist.push( 20 )
llist.push( 4 )
llist.push( 15 )
llist.push( 10 )
llist.head. next . next . next . next = llist.head
if (llist.detectLoop()):
print ( "Loop Found" )
else :
print ( "No Loop" )
|
C#
using System;
public class LinkedList {
Node head;
public class Node {
public int data;
public Node next;
public Node( int d)
{
data = d;
next = null ;
}
}
public void push( int new_data)
{
Node new_node = new Node(new_data);
new_node.next = head;
head = new_node;
}
Boolean detectLoop()
{
Node slow_p = head, fast_p = head;
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 == fast_p) {
return true ;
}
}
return false ;
}
public static void Main(String[] args)
{
LinkedList llist = new LinkedList();
llist.push(20);
llist.push(4);
llist.push(15);
llist.push(10);
llist.head.next.next.next.next = llist.head;
Boolean found = llist.detectLoop();
if (found) {
Console.WriteLine( "Loop Found" );
}
else {
Console.WriteLine( "No Loop" );
}
}
}
|
Javascript
<script>
let head;
class Node
{
constructor(d)
{
this .data = d;
this .next = null ;
}
}
function push(new_data)
{
let new_node = new Node(new_data);
new_node.next = head;
head = new_node;
}
function detectLoop()
{
let slow_p = head, fast_p = head;
let flag = 0;
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 == fast_p)
{
flag = 1;
break ;
}
}
if (flag == 1)
document.write( "Loop Found<br>" );
else
document.write( "No Loop<br>" );
}
push(20);
push(4);
push(15);
push(10);
head.next.next.next.next = head;
detectLoop();
</script>
|
Time complexity: O(N), Only one traversal of the loop is needed.
Auxiliary Space: O(1).
Detect loop in a linked list by Marking visited nodes without modifying Node structure:
The idea is to point the current node of the linked list to a node which is created. Whenever a node’s next is pointing to that node it means loop is there.
Follow the steps below to solve the problem:
- A temporary node is created.
- The next pointer of each node that is traversed is made to point to this temporary node.
- This way we are using the next pointer of a node as a flag to indicate whether the node has been traversed or not.
- Every node is checked to see if the next is pointing to a temporary node or not.
- In the case of the first node of the loop, the second time we traverse it this condition will be true, hence we find that loop exists.
- If we come across a node that points to null then the loop doesn’t exist.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int key;
struct Node* next;
};
Node* newNode( int key)
{
Node* temp = new Node;
temp->key = key;
temp->next = NULL;
return temp;
}
void printList(Node* head)
{
while (head != NULL) {
cout << head->key << " " ;
head = head->next;
}
cout << endl;
}
bool detectLoop(Node* head)
{
Node* temp = new Node;
while (head != NULL) {
if (head->next == NULL)
return false ;
if (head->next == temp)
return true ;
Node* next = head->next;
head->next = temp;
head = next;
}
return false ;
}
int main()
{
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->next;
bool found = detectLoop(head);
if (found)
cout << "Loop Found" ;
else
cout << "No Loop" ;
return 0;
}
|
C
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int key;
struct Node* next;
} Node;
Node* newNode( int key)
{
Node* temp = (Node*) malloc ( sizeof (Node));
temp->key = key;
temp->next = NULL;
return temp;
}
void printList(Node* head)
{
while (head != NULL) {
printf ( "%d " , head->key);
head = head->next;
}
printf ( "\n" );
}
bool detectLoop(Node* head)
{
Node* temp = (Node*) malloc ( sizeof (Node));
while (head != NULL) {
if (head->next == NULL)
return false ;
if (head->next == temp)
return true ;
Node* next = head->next;
head->next = temp;
head = next;
}
return false ;
}
int main()
{
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->next;
bool found = detectLoop(head);
if (found)
printf ( "Loop Found" );
else
printf ( "No Loop" );
return 0;
}
|
Java
public class GFG {
static class Node {
int key;
Node next;
};
static Node newNode( int key)
{
Node temp = new Node();
temp.key = key;
temp.next = null ;
return temp;
}
static void printList(Node head)
{
while (head != null ) {
System.out.print(head.key + " " );
head = head.next;
}
System.out.println();
}
static boolean detectLoop(Node head)
{
Node temp = new Node();
while (head != null ) {
if (head.next == null ) {
return false ;
}
if (head.next == temp) {
return true ;
}
Node next = head.next;
head.next = temp;
head = next;
}
return false ;
}
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 );
head.next.next.next.next.next = head.next.next;
boolean found = detectLoop(head);
if (found)
System.out.println( "Loop Found" );
else
System.out.println( "No Loop" );
}
};
|
Python3
class newNode:
def __init__( self , key):
self .key = key
self .left = None
self .right = None
def printList(head):
while (head ! = None ):
print (head.key, end = " " )
head = head. next
print ()
def detectLoop(head):
temp = ""
while (head ! = None ):
if (head. next = = None ):
return False
if (head. next = = temp):
return True
next = head. next
head. next = temp
head = next
return False
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 . next
found = detectLoop(head)
if (found):
print ( "Loop Found" )
else :
print ( "No Loop" )
|
C#
using System;
public class GFG {
public class Node {
public int key;
public Node next;
};
static Node newNode( int key)
{
Node temp = new Node();
temp.key = key;
temp.next = null ;
return temp;
}
static void printList(Node head)
{
while (head != null ) {
Console.Write(head.key + " " );
head = head.next;
}
Console.WriteLine();
}
static Boolean detectLoop(Node head)
{
Node temp = new Node();
while (head != null ) {
if (head.next == null ) {
return false ;
}
if (head.next == temp) {
return true ;
}
Node next = head.next;
head.next = temp;
head = nex;
}
return false ;
}
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);
head.next.next.next.next.next = head.next.next;
Boolean found = detectLoop(head);
if (found) {
Console.WriteLine( "Loop Found" );
}
else {
Console.WriteLine( "No Loop" );
}
}
}
|
Javascript
<script>
class Node
{
constructor(key)
{
this .key = key;
this .next = null ;
}
}
function printList(head)
{
while (head != null )
{
document.write(head.key + " " );
head = head.next;
}
document.write( "<br>" );
}
function detectLoop(head)
{
let temp = new Node();
while (head != null )
{
if (head.next == null )
{
return false ;
}
if (head.next == temp)
{
return true ;
}
let next = head.next;
head.next = temp;
head = nex;
}
return false ;
}
let 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);
head.next.next.next.next.next = head.next.next;
let found = detectLoop(head);
if (found)
document.write( "Loop Found" );
else
document.write( "No Loop" );
</script>
|
Time complexity: O(N). Only one traversal of the loop is needed.
Auxiliary Space: O(1)
Detect loop in a linked list by Storing length:
The idea is to store the length of the list from first node and last node, increment last node till reaches NULL or number of nodes in last is greater the current between first and last nodes.
Follow the steps below to solve the problem:
- In this method, two pointers are created, first (always points to head) and last.
- Each time the last pointer moves calculate no of nodes between the first and last.
- check whether the current no of nodes > previous no of nodes
- If yes we proceed by moving the last pointer
- Else it means we’ve reached the end of the loop, so return output accordingly.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int key;
struct Node* next;
};
Node* newNode( int key)
{
Node* temp = new Node;
temp->key = key;
temp->next = NULL;
return temp;
}
void printList(Node* head)
{
while (head != NULL) {
cout << head->key << " " ;
head = head->next;
}
cout << endl;
}
int distance(Node* first, Node* last)
{
int counter = 0;
Node* curr;
curr = first;
while (curr != last) {
counter += 1;
curr = curr->next;
}
return counter + 1;
}
bool detectLoop(Node* head)
{
Node* temp = new Node;
Node *first, *last;
first = head;
last = head;
int current_length = 0;
int prev_length = -1;
while (current_length > prev_length && last != NULL) {
prev_length = current_length;
current_length = distance(first, last);
last = last->next;
}
if (last == NULL) {
return false ;
}
else {
return true ;
}
}
int main()
{
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->next;
bool found = detectLoop(head);
if (found)
cout << "Loop Found" ;
else
cout << "No Loop Found" ;
return 0;
}
|
C
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int key;
struct Node* next;
} Node;
Node* newNode( int key)
{
Node* temp = (Node*) malloc ( sizeof (Node));
temp->key = key;
temp->next = NULL;
return temp;
}
void printList(Node* head)
{
while (head != NULL) {
printf ( "%d " , head->key);
head = head->next;
}
printf ( "\n" );
}
int distance(Node* first, Node* last)
{
int counter = 0;
Node* curr;
curr = first;
while (curr != last) {
counter += 1;
curr = curr->next;
}
return counter + 1;
}
bool detectLoop(Node* head)
{
Node* temp = (Node *) malloc ( sizeof (Node));
Node *first, *last;
first = head;
last = head;
int current_length = 0;
int prev_length = -1;
while (current_length > prev_length && last != NULL) {
prev_length = current_length;
current_length = distance(first, last);
last = last->next;
}
if (last == NULL)
return false ;
else
return true ;
}
int main()
{
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->next;
bool found = detectLoop(head);
if (found)
printf ( "Loop Found" );
else
printf ( "No Loop Found" );
return 0;
}
|
Java
import java.util.*;
class GFG
{
static class Node
{
int key;
Node next;
};
static Node newNode( int key)
{
Node temp = new Node();
temp.key = key;
temp.next = null ;
return temp;
}
static void printList(Node head)
{
while (head != null )
{
System.out.print(head.key + " " );
head = head.next;
}
System.out.println();
}
static int distance(Node first, Node last)
{
int counter = 0 ;
Node curr;
curr = first;
while (curr != last)
{
counter += 1 ;
curr = curr.next;
}
return counter + 1 ;
}
static boolean detectLoop(Node head)
{
Node temp = new Node();
Node first, last;
first = head;
last = head;
int current_length = 0 ;
int prev_length = - 1 ;
while (current_length > prev_length && last != null )
{
prev_length = current_length;
current_length = distance(first, last);
last = last.next;
}
if (last == null )
{
return false ;
}
else
{
return true ;
}
}
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 );
head.next.next.next.next.next = head.next.next;
boolean found = detectLoop(head);
if (found)
System.out.print( "Loop Found" );
else
System.out.print( "No Loop Found" );
}
}
|
Python3
class newNode:
def __init__( self , key):
self .key = key
self .left = None
self .right = None
def printList(head):
while (head ! = None ) :
print (head.key, end = " " )
head = head. next ;
print ()
def distance(first, last):
counter = 0
curr = first
while (curr ! = last):
counter = counter + 1
curr = curr. next
return counter + 1
def detectLoop(head):
temp = ""
first = head;
last = head;
current_length = 0
prev_length = - 1
while (current_length > prev_length and last ! = None ) :
prev_length = current_length
current_length = distance(first, last)
last = last. next ;
if (last = = None ) :
return False
else :
return True
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 . next ;
found = detectLoop(head)
if (found) :
print ( "Loop Found" )
else :
print ( "No Loop Found" )
|
C#
using System;
public class GFG
{
public
class Node
{
public
int key;
public
Node next;
};
static Node newNode( int key)
{
Node temp = new Node();
temp.key = key;
temp.next = null ;
return temp;
}
static void printList(Node head)
{
while (head != null )
{
Console.Write(head.key + " " );
head = head.next;
}
Console.WriteLine();
}
static int distance(Node first, Node last)
{
int counter = 0;
Node curr;
curr = first;
while (curr != last)
{
counter += 1;
curr = curr.next;
}
return counter + 1;
}
static bool detectLoop(Node head)
{
Node temp = new Node();
Node first, last;
first = head;
last = head;
int current_length = 0;
int prev_length = -1;
while (current_length > prev_length && last != null )
{
prev_length = current_length;
current_length = distance(first, last);
last = last.next;
}
if (last == null )
{
return false ;
}
else
{
return true ;
}
}
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);
head.next.next.next.next.next = head.next.next;
bool found = detectLoop(head);
if (found)
Console.Write( "Loop Found" );
else
Console.Write( "No Loop Found" );
}
}
|
Javascript
<script>
class Node
{
constructor(key)
{
this .key = key;
this .next = null ;
}
}
function newNode(key)
{
let temp = new Node(key);
return temp;
}
function printList(head)
{
while (head != null )
{
document.write(head.key + " " );
head = head.next;
}
document.write( "</br>" );
}
function distance(first, last)
{
let counter = 0;
let curr;
curr = first;
while (curr != last)
{
counter += 1;
curr = curr.next;
}
return counter + 1;
}
function detectLoop(head)
{
let temp = new Node();
let first, last;
first = head;
last = head;
let current_length = 0;
let prev_length = -1;
while (current_length > prev_length &&
last != null )
{
prev_length = current_length;
current_length = distance(first, last);
last = last.next;
}
if (last == null )
{
return false ;
}
else
{
return true ;
}
}
let 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.next;
let found = detectLoop(head);
if (found)
document.write( "Loop Found" );
else
document.write( "No Loop Found" );
</script>
|
Time complexity: O(N2), For every node calculate the length of that node from the head by traversing.
Auxiliary Space: O(1)
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!