- Given a single linked list, we would like to find out whether loop or cycle exists in a single linked list.
- We will iterate through single linked list using non-recursive algorithm.
- We have discussed similar problems
What is cycle or loop in a single linked list ?
Let us take an example to elaborate the problem statement. We have shown the single linked list in Fig 1.
- The single list shown in Fig 1 is not null terminated.
- if we start traversing the single linked list, it will never terminate.
- 20 -> 25-> 30-> 35-> 40 -> 45-> 50-> 55-> 30-> 35-> 40 -> 45-> 50-> 55->
- if we start traversing the single linked list, it will never terminate.
- The single linked list traversal will always remain in infinite loop.
- This is very important point to detect whether loop exist in the linked list.
Floyd’s cycle detection algorithm to find loop in single linked list.
Step 1: Floyd’s cycle detection algorithm
- Take slow and fast pointer.
- slow and fast pointer will point to head of linked list
- slow pointer will jump by 1 node.
- fast pointer will jump by 2 nodes.
Step 2: Floyd’s cycle detection algorithm
- slow pointer jumped by 1 node.
- fast pointer jumped by 2 node.
Step 3: Floyd’s cycle detection algorithm
- fast pointer keep on moving by two nodes
- slow pointer will keep in jumping by 1 node
Step 4: Floyd’s cycle detection algorithm
- Keep on performing the step 3
- We will encounter the situation where slow == fast
- Signifies that the loop exists in a single linked list
- If we did not encounter slow == fast
- Linked list does not have loop
Time complexity of algorithm is O (n).
Program – Floyd’s cycle detection algorithm to find loop in single linked list
1.) DetectLoop Class:
- We are passing the head of single linked list, to isLooped method.
- isLooped method is used to detect, whether loop exists in a single linked list.
package org.learn.Question; public class DetectLoop { public static boolean isLooped(Node head) { if (null == head) { System.out.println("Single linked list is empty"); return false; } Node slow = head; Node fast = head; while (slow != null && fast != null && fast.next != null) { fast = fast.next; if (slow == fast) { System.out.println("Loop exists in a single linked list"); return true; } fast = fast.next; if (slow == fast) { System.out.println("Loop exists in a single linked list"); return true; } slow = slow.next; } System.out.println("No loop exists in a single linked list"); return false; } public static Node insert(Node head, int data) { while (head.next != null) head = head.next; head.next = new Node(data); return head.next; } }
2.) DetechLoopClient Class:
- We are creating a single linked list in main method.
- We are calling DetectLoop.isLooped method, to check whether loop exists in a single linked list
package org.learn.Client; import org.learn.Question.DetectLoop; import org.learn.Question.Node; public class DetechLoopClient { public static void main(String[] args) { int[] data = { 30, 35, 40, 45, 50, 55 }; Node node30 = new Node(data[0]); Node node = null; for (int count = 1; count < data.length; count++) { node = DetectLoop.insert(node30, data[count]); } node.next = node30; node = new Node(20); node.next = new Node(25); node.next.next = node30; DetectLoop.isLooped(node); } }
3.) Node Class:
- Node class representing the nodes of a single linked list
package org.learn.Question; public class Node { public int data; public Node next; public Node(int num) { this.data = num; this.next = null; } }
Output – Floyd’s cycle detection algorithm to check loop in a single linked list
Loop found in linked list