Detect Cycle in Linked List using Floyd's Algorithm
📖 Scenario: Imagine you are working with a train track system represented as a linked list of stations. Sometimes, the track loops back creating a cycle. Your job is to detect if such a cycle exists.
🎯 Goal: Build a linked list and use Floyd's Cycle Detection Algorithm to find out if there is a cycle in the list.
📋 What You'll Learn
Create a linked list with nodes containing integer values
Add a cycle by linking the last node to one of the previous nodes
Implement Floyd's Cycle Detection Algorithm using two pointers
Print true if a cycle is detected, otherwise false
💡 Why This Matters
🌍 Real World
Cycle detection is important in network routing, detecting infinite loops in software, and analyzing linked data structures.
💼 Career
Understanding cycle detection algorithms is essential for software engineers working with linked data, debugging, and optimizing code.
Progress0 / 4 steps
1
Create a linked list with nodes
Create a linked list with nodes containing values 3, 2, 0, and -4 in that order. Define a struct called ListNode with fields Val int and Next *ListNode. Create variables head, second, third, and fourth for the nodes and link them sequentially.
DSA Go
Hint
Define the node structure first. Then create each node and link them using the Next pointer.
2
Create a cycle in the linked list
Create a cycle by setting the Next pointer of the fourth node to point back to the second node.
DSA Go
Hint
Set the Next of the last node to the second node to form a loop.
3
Implement Floyd's Cycle Detection Algorithm
Implement Floyd's Cycle Detection Algorithm using two pointers named slow and fast. Initialize both to head. Move slow by one step and fast by two steps in a loop. If fast or fast.Next becomes nil, break and conclude no cycle. If slow equals fast at any point, break and conclude cycle detected. Store the result in a boolean variable called hasCycle.
DSA Go
Hint
Use two pointers moving at different speeds. If they meet, a cycle exists.
4
Print the result of cycle detection
Print the value of the boolean variable hasCycle to display true if a cycle is detected or false if not.
DSA Go
Hint
Use fmt.Println(hasCycle) to print the result.
Practice
(1/5)
1. What is the main idea behind Floyd's Cycle Detection Algorithm in a linked list?
easy
A. Reverse the linked list and check if it matches the original
B. Count the number of nodes and check if it exceeds a limit
C. Use two pointers moving at different speeds to detect a cycle
D. Use a hash map to store visited nodes
Solution
Step 1: Understand Floyd's Algorithm concept
It uses two pointers, one moving one step at a time (slow), and another moving two steps at a time (fast).
Step 2: Detect cycle by pointer meeting
If the fast pointer meets the slow pointer, it means there is a cycle in the linked list.
Final Answer:
Use two pointers moving at different speeds to detect a cycle -> Option C
Quick Check:
Two pointers at different speeds = cycle detection [OK]
Hint: Two pointers at different speeds detect cycle fast [OK]
Common Mistakes:
Thinking counting nodes detects cycle
Assuming reversing list helps detect cycle
Using extra memory like hash map is not Floyd's method
2. Which of the following Go code snippets correctly initializes the two pointers for Floyd's cycle detection in a linked list named head?
easy
A. slow, fast := head, head
B. slow, fast := head.next, head.next.next
C. slow, fast := head, head.next
D. slow, fast := nil, head
Solution
Step 1: Initialize both pointers at head
Floyd's algorithm starts both slow and fast pointers at the head node.
Step 2: Move pointers inside loop, not at initialization
Moving fast or slow pointer ahead at initialization can skip nodes or cause errors.
Final Answer:
slow, fast := head, head -> Option A
Quick Check:
Both pointers start at head [OK]
Hint: Start both pointers at head before loop [OK]
Common Mistakes:
Starting fast pointer ahead causing nil pointer errors
Initializing slow pointer ahead skipping first node
Setting slow pointer to nil initially
3. What will be the output of the following Go code snippet detecting a cycle in a linked list?
type Node struct {
val int
next *Node
}
func hasCycle(head *Node) bool {
slow, fast := head, head
for fast != nil && fast.next != nil {
slow = slow.next
fast = fast.next.next
if slow == fast {
return true
}
}
return false
}
// Linked list setup
n1 := &Node{val: 1}
n2 := &Node{val: 2}
n3 := &Node{val: 3}
n4 := &Node{val: 4}
n1.next = n2
n2.next = n3
n3.next = n4
n4.next = n2 // cycle here
fmt.Println(hasCycle(n1))
medium
A. true
B. false
C. runtime error
D. infinite loop
Solution
Step 1: Analyze linked list structure
The list nodes are connected 1->2->3->4, and 4 points back to 2, creating a cycle.
Step 2: Trace Floyd's algorithm behavior
Slow and fast pointers will eventually meet inside the cycle, so function returns true.
Final Answer:
true -> Option A
Quick Check:
Cycle exists, so output is true [OK]
Hint: Cycle means pointers meet, so return true [OK]
Common Mistakes:
Assuming no cycle because list looks linear
Expecting false without tracing pointers
Confusing cycle detection with list length
4. Identify the bug in this Go code snippet for detecting a cycle in a linked list:
func hasCycle(head *Node) bool {
slow, fast := head, head
for fast != nil {
slow = slow.next
fast = fast.next.next
if slow == fast {
return true
}
}
return false
}
medium
A. The slow pointer should move two steps instead of one
B. The loop condition should check fast.next != nil to avoid nil pointer dereference
C. The fast pointer should move one step instead of two
D. The function should return false inside the loop when pointers don't meet
Solution
Step 1: Check loop condition safety
The loop only checks fast != nil, but fast.next could be nil causing fast.next.next to panic.
Step 2: Correct loop condition
Loop should check both fast != nil and fast.next != nil to safely move fast pointer two steps.
Final Answer:
The loop condition should check fast.next != nil to avoid nil pointer dereference -> Option B
Quick Check:
Check fast and fast.next != nil before moving fast [OK]
Hint: Always check fast.next != nil before fast.next.next [OK]
5. Given a linked list where the cycle starts at node with value 3, how can Floyd's algorithm be extended to find the exact node where the cycle begins?
hard
A. Count nodes until pointers meet and return the count as cycle start position
B. Reverse the linked list and check where reversal breaks to find cycle start
C. Use a hash map to store nodes and find the first repeated node
D. After detecting the cycle, reset one pointer to head and move both one step until they meet at cycle start
Solution
Step 1: Detect cycle using Floyd's algorithm
First, detect if a cycle exists by moving slow and fast pointers until they meet.
Step 2: Find cycle start node
Reset one pointer to head, then move both pointers one step at a time; the node where they meet is the cycle start.
Final Answer:
After detecting the cycle, reset one pointer to head and move both one step until they meet at cycle start -> Option D
Quick Check:
Reset pointer + move one step = cycle start [OK]
Hint: Reset pointer to head after cycle detection to find start [OK]
Common Mistakes:
Trying to count nodes instead of resetting pointer
Using extra memory instead of pointer method
Reversing list which breaks structure
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.