📖 Scenario: Imagine you have a chain of connected train cars. Sometimes, the last car connects back to an earlier car, making a loop. We want to check if the train cars form such a loop.
🎯 Goal: You will create a simple linked list and write code to check if it forms a circular loop or not.
📋 What You'll Learn
Create a linked list with nodes containing numbers
Add a variable to help detect circularity
Write a function to check if the linked list is circular
Print the result as true or false
💡 Why This Matters
🌍 Real World
Detecting loops in linked lists is important in computer programs that manage chains of data, like train cars, playlists, or network packets.
💼 Career
Understanding how to detect circular references helps in debugging memory leaks and designing efficient data structures in software development.
Progress0 / 4 steps
1
Create a simple linked list
Create a class called Node with a value property of type number and a next property that can be another Node or null. Then create three nodes with values 1, 2, and 3. Link them so that the first node points to the second, and the second points to the third. Store the first node in a variable called head.
DSA Typescript
Hint
Define the Node class first. Then create three nodes and link them by setting the next property.
2
Add a helper variable for detection
Create a variable called slow and set it to head. Also create a variable called fast and set it to head. These will help us move through the list at different speeds.
DSA Typescript
Hint
Set both slow and fast to start at head.
3
Write function to detect circular linked list
Write a function called isCircular that takes head as input. Inside, use a while loop that continues as long as fast and fast.next are not null. Move slow one step forward and fast two steps forward. If at any point slow equals fast, return true. If the loop ends, return false.
DSA Typescript
Hint
Use two pointers moving at different speeds. If they meet, the list is circular.
4
Print the result of circular check
Use console.log to print the result of calling isCircular(head).
DSA Typescript
Hint
Call isCircular(head) and print the result using console.log.
Practice
(1/5)
1. What does it mean if a linked list is circular?
easy
A. The last node points back to one of the previous nodes, forming a loop
B. The linked list has no nodes
C. The linked list nodes are sorted in ascending order
D. The linked list has only one node
Solution
Step 1: Understand linked list structure
A linked list is a chain of nodes where each node points to the next node.
Step 2: Define circular linked list
If the last node points back to any previous node, it creates a loop, making the list circular.
Final Answer:
The last node points back to one of the previous nodes, forming a loop -> Option A
Quick Check:
Circular linked list = last node points back [OK]
Hint: Circular means last node links back to earlier node [OK]
Common Mistakes:
Thinking circular means sorted
Confusing empty list with circular
Assuming single node list is always circular
2. Which TypeScript code snippet correctly checks if a linked list is circular using two pointers?
B. let slow = head; while(slow) { slow = slow.next; if(slow === head) return true; } return false;
C. let slow = head; let fast = head; while(fast && fast.next) { slow = slow.next; fast = fast.next.next; if(slow === fast) return true; } return false;
D. let current = head; while(current.next) { current = current.next; } return current === null;
Solution
Step 1: Understand Floyd's cycle detection
Use two pointers: slow moves 1 step, fast moves 2 steps. If they meet, list is circular.
Step 2: Analyze code snippets
let slow = head; let fast = head; while(fast && fast.next) { slow = slow.next; fast = fast.next.next; if(slow === fast) return true; } return false; correctly implements this logic with proper conditions and pointer moves.
Final Answer:
let slow = head; let fast = head; while(fast && fast.next) { slow = slow.next; fast = fast.next.next; if(slow === fast) return true; } return false; -> Option C
Quick Check:
Two pointers meet means circular [OK]
Hint: Use slow and fast pointers to detect loop [OK]
Common Mistakes:
Moving fast pointer only one step
Not checking fast and fast.next for null
Returning false too early
3. What will be the output of this TypeScript code snippet?
class Node { constructor(public val: number, public next: Node | null = null) {} } const head = new Node(1); head.next = new Node(2); head.next.next = new Node(3); head.next.next.next = head.next; function isCircular(head: Node | null): boolean { let slow = head; let fast = head; while (fast && fast.next) { slow = slow.next; fast = fast.next.next; if (slow === fast) return true; } return false; } console.log(isCircular(head));
medium
A. true
B. false
C. undefined
D. Runtime error
Solution
Step 1: Understand the linked list structure
Nodes 1 -> 2 -> 3, then 3 points back to node 2, creating a loop.
Step 2: Trace the two-pointer loop detection
Slow and fast pointers will meet inside the loop, so function returns true.
Final Answer:
true -> Option A
Quick Check:
Loop exists, so output is true [OK]
Hint: Loop in list makes function return true [OK]
Common Mistakes:
Assuming no loop because list looks linear
Confusing node references
Ignoring pointer equality check
4. Identify the bug in this TypeScript function meant to detect a circular linked list:
function isCircular(head: Node | null): boolean { let slow = head; let fast = head; while (fast !== null) { slow = slow.next; fast = fast.next.next; if (slow === fast) return true; } return false; }
medium
A. The function should use a for loop instead of while
B. The slow pointer should move two steps instead of one
C. The function should return false inside the loop
D. The while loop should check fast and fast.next for null before moving pointers
Solution
Step 1: Analyze pointer movement safety
fast.next.next is accessed without checking if fast.next is null, risking runtime error.
Step 2: Correct loop condition
Loop should check both fast and fast.next are not null before moving pointers to avoid errors.
Final Answer:
The while loop should check fast and fast.next for null before moving pointers -> Option D
Quick Check:
Check fast and fast.next to avoid errors [OK]
Hint: Always check fast and fast.next before advancing fast [OK]
Common Mistakes:
Not checking fast.next before fast.next.next
Moving slow pointer incorrectly
Returning false too early
5. Given a singly linked list where the last node might point to any node in the list or null, how would you modify the detection function to also return the node where the cycle begins if it is circular? Which approach correctly finds the start of the loop?
hard
A. Count the number of nodes and return the middle node as the start of the loop
B. After detecting the cycle, reset one pointer to head and move both pointers one step at a time until they meet; the meeting point is the start of the loop
C. Use a hash set to store visited nodes and return the first repeated node found
D. Reverse the linked list and check if the head changes to detect the loop start
Solution
Step 1: Detect cycle using two pointers
Use Floyd's algorithm to find if slow and fast pointers meet inside the loop.
Step 2: Find loop start node
Reset one pointer to head, move both pointers one step at a time; their meeting point is the loop start.
Final Answer:
After detecting the cycle, reset one pointer to head and move both pointers one step at a time until they meet; the meeting point is the start of the loop -> Option B
Quick Check:
Reset pointer and move both to find loop start [OK]
Hint: Reset pointer after cycle detection to find loop start [OK]
Common Mistakes:
Assuming middle node is loop start
Using node count instead of pointers
Trying to reverse list to find loop
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.