Remove loop in Linked List
JavaView on GFG
Time: O(n)
Space: O(1)
Problem Overview
Detect loop with Floyd cycle detection.
Advertisement
Intuition
Detect loop with Floyd cycle detection. Find loop start, then carefully remove the link without losing the rest of the list.
Algorithm
- 1Floyd: slow and fast pointers. If they meet, loop exists.
- 2Find loop start: reset one pointer to head, advance both one step at a time until they meet.
- 3Remove: traverse loop from start to find the node just before start. Set its next to null.
Common Pitfalls
- • When resetting to find loop start, both pointers move at same speed. The node just before start is found by traversing the loop.
Remove loop in Linked List.java
Java
// Approach: Floyd's cycle detection. Find loop start, then advance one pointer to find the node just before the start.
// Time: O(n) Space: O(1)
class Node {
int data;
Node next;
}
class Solution {
// Function to remove a loop in the linked list.
public static void removeLoop(Node head) {
if (head == null || head.next == null)
return; // If list is empty or contains only one node, no loop can exist.
Node slow = head, fast = head;
// Detect loop using Floyd's Cycle Detection Algorithm
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
// If slow and fast meet, a loop is detected
if (slow == fast) {
removeLoopNode(head, slow);
return;
}
}
}
// Helper function to remove the loop
private static void removeLoopNode(Node head, Node loopNode) {
Node ptr1 = head;
Node ptr2 = loopNode;
// Find the node where the loop starts
while (ptr1 != ptr2) {
ptr1 = ptr1.next;
ptr2 = ptr2.next;
}
// Now `ptr1` (or `ptr2`) is at the loop start node.
// Find the last node in the loop
Node last = ptr1;
while (last.next != ptr1)
last = last.next;
// Break the loop by setting the next of the last node to null
last.next = null;
}
}Advertisement
Was this solution helpful?