📖 Scenario: Imagine you have a chain of connected train cars. Normally, the last car is not connected to any other car. But sometimes, the last car connects back to one of the earlier cars, making a loop. This is called a circular chain.In programming, a linked list is like this chain of train cars. We want to check if the linked list forms a loop (is circular) or not.
🎯 Goal: You will create a linked list, then write code to check if it is circular (has a loop) or not. Finally, you will print the result.
📋 What You'll Learn
Create a linked list with 4 nodes containing values 10, 20, 30, 40
Add a pointer variable to help detect circularity
Write a function to check if the linked list is circular
Print "Circular" if the list has a loop, otherwise print "Not Circular"
💡 Why This Matters
🌍 Real World
Detecting loops in linked lists is important in software that manages chains of data or tasks, such as operating systems, network packet routing, and memory management.
💼 Career
Understanding how to detect circular linked lists helps in debugging and optimizing programs that use linked data structures, a common task in software development and technical interviews.
Progress0 / 4 steps
1
Create a linked list with 4 nodes
Create a linked list with 4 nodes containing values 10, 20, 30, and 40. Use a struct called Node with an int data and a Node* next. Create a pointer called head that points to the first node.
DSA C
Hint
Remember to create each node with malloc and link them by setting the next pointer.
2
Add a pointer to help detect circularity
Add a pointer variable called slow and set it to head. Also add a pointer called fast and set it to head. These will help us check if the list is circular.
DSA C
Hint
Set both slow and fast pointers to head to start checking from the beginning.
3
Write a function to check if the linked list is circular
Write a function called isCircular that takes a Node* called head and returns 1 if the list is circular, otherwise 0. Use the slow and fast pointer technique: move slow by one step and fast by two steps. If they meet, the list is circular. If fast or fast->next becomes NULL, the list is not circular.
DSA C
Hint
Move slow by one step and fast by two steps inside a loop. If they meet, return 1. If fast reaches NULL, return 0.
4
Print if the linked list is circular or not
Call the function isCircular with head. If it returns 1, print "Circular". Otherwise, print "Not Circular".
DSA C
Hint
Use if (isCircular(head)) to check. Print "Circular" if true, else "Not Circular".
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: Identify circular linked list property
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 inside list [OK]
Common Mistakes:
Thinking circular means sorted
Confusing empty list with circular
Assuming single node list is always circular
2. Which of the following C code snippets correctly checks if a linked list is circular?
easy
A. for (int i = 0; i < 10; i++) { head = head->next; } return 0;
B. if (head == NULL) return 1; else return 0;
C. while (head->next != NULL) { head = head->next; } return 1;
D. while (head != NULL) { head = head->next; if (head == start) return 1; } return 0;
Solution
Step 1: Analyze code logic for circular detection
The code moves through nodes until it finds the start node again, indicating a loop.
Step 2: Check other options for correctness
if (head == NULL) return 1; else return 0; only checks if list is empty, not circular. while (head->next != NULL) { head = head->next; } return 1; stops at NULL, no loop check. for (int i = 0; i < 10; i++) { head = head->next; } return 0; blindly moves 10 steps without loop check.
Final Answer:
while (head != NULL) { head = head->next; if (head == start) return 1; } return 0; -> Option D
Quick Check:
Loop check by revisiting start node = while (head != NULL) { head = head->next; if (head == start) return 1; } return 0; [OK]
Hint: Check if traversal returns to start node [OK]
Common Mistakes:
Only checking for NULL without loop detection
Using fixed iteration count instead of loop condition
Returning true for empty list
3. What will be the output of the following C code snippet?
Function moves temp pointer until it finds head again or NULL. Here, temp will reach head again, so returns 1.
Final Answer:
1 -> Option C
Quick Check:
Loop detected, returns 1 [OK]
Hint: Returns 1 if traversal loops back to head [OK]
Common Mistakes:
Assuming NULL termination means circular
Confusing return values 0 and 1
Not initializing temp correctly
4. Identify the bug in the following code that tries to detect if a linked list is circular:
int isCircular(Node* head) {
Node* slow = head;
Node* fast = head->next;
while (fast != NULL && fast->next != NULL) {
if (slow == fast) return 1;
slow = slow->next;
fast = fast->next->next;
}
return 0;
}
medium
A. slow pointer should move two steps, fast one step
B. fast pointer initialization should be head, not head->next
C. The loop condition should check only fast != NULL
D. Return values are reversed
Solution
Step 1: Understand Floyd's cycle detection setup
Both slow and fast pointers should start at head to detect cycle properly.
Step 2: Identify initialization error
fast is initialized to head->next, which can miss cycle detection if list has only one node or cycle starts at head.
Final Answer:
fast pointer initialization should be head, not head->next -> Option B
Quick Check:
Initialize fast = head for correct cycle detection [OK]
Hint: Start both pointers at head for Floyd's cycle detection [OK]
Common Mistakes:
Starting fast pointer one step ahead
Swapping slow and fast pointer steps
Ignoring null checks in loop condition
5. You have a singly linked list where the last node's next pointer is unknown. How would you modify the list to make it circular and then detect the cycle using Floyd's algorithm? Choose the correct sequence of steps.
hard
A. 1. Traverse to last node
2. Set last node's next to head
3. Use Floyd's algorithm to detect cycle
B. 1. Set head's next to NULL
2. Use Floyd's algorithm
3. Traverse list
C. 1. Reverse the list
2. Set last node's next to NULL
3. Use Floyd's algorithm
D. 1. Traverse to middle node
2. Set middle node's next to head
3. Use Floyd's algorithm
Solution
Step 1: Make the list circular by linking last node to head
Traverse the list to find the last node, then set its next pointer to head to form a loop.
Step 2: Apply Floyd's cycle detection algorithm
Use slow and fast pointers starting at head to detect the cycle created.
Final Answer:
1. Traverse to last node
2. Set last node's next to head
3. Use Floyd's algorithm to detect cycle -> Option A
Quick Check:
Make circular then detect cycle with Floyd's algorithm [OK]
Hint: Link last node to head before running cycle detection [OK]
Common Mistakes:
Setting wrong node's next pointer
Not traversing to last node correctly
Using Floyd's algorithm before making list circular
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.