Bird
Raised Fist0
DSA Cprogramming~20 mins

Detect if a Linked List is Circular in DSA C - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Circular List Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this code detecting a circular linked list?

Consider the following C code that checks if a linked list is circular. What will it print?

DSA C
typedef struct Node {
    int data;
    struct Node* next;
} Node;

#include <stdio.h>
#include <stdlib.h>

int isCircular(Node* head) {
    if (head == NULL) return 0;
    Node* temp = head->next;
    while (temp != NULL && temp != head) {
        temp = temp->next;
    }
    return (temp == head);
}

int main() {
    Node* head = (Node*)malloc(sizeof(Node));
    Node* second = (Node*)malloc(sizeof(Node));
    Node* third = (Node*)malloc(sizeof(Node));

    head->data = 1; head->next = second;
    second->data = 2; second->next = third;
    third->data = 3; third->next = head; // circular link

    if (isCircular(head)) {
        printf("Circular\n");
    } else {
        printf("Not Circular\n");
    }
    return 0;
}
ACircular
BNot Circular
CSegmentation fault
DInfinite loop
Attempts:
2 left
💡 Hint

Check if the traversal reaches back to the head node.

❓ Predict Output
intermediate
2:00remaining
What is the output when the linked list is not circular?

What will the following code print if the linked list is not circular?

DSA C
typedef struct Node {
    int data;
    struct Node* next;
} Node;

#include <stdio.h>
#include <stdlib.h>

int isCircular(Node* head) {
    if (head == NULL) return 0;
    Node* temp = head->next;
    while (temp != NULL && temp != head) {
        temp = temp->next;
    }
    return (temp == head);
}

int main() {
    Node* head = (Node*)malloc(sizeof(Node));
    Node* second = (Node*)malloc(sizeof(Node));
    Node* third = (Node*)malloc(sizeof(Node));

    head->data = 1; head->next = second;
    second->data = 2; second->next = third;
    third->data = 3; third->next = NULL; // not circular

    if (isCircular(head)) {
        printf("Circular\n");
    } else {
        printf("Not Circular\n");
    }
    return 0;
}
AInfinite loop
BCircular
CSegmentation fault
DNot Circular
Attempts:
2 left
💡 Hint

Check if the last node points to NULL.

🔧 Debug
advanced
2:00remaining
Why does this code cause an infinite loop when checking circularity?

Examine the code below. Why does it cause an infinite loop when the list is circular?

DSA C
int isCircular(Node* head) {
    Node* temp = head;
    while (temp != NULL) {
        temp = temp->next;
    }
    return 0;
}
ABecause temp is never updated inside the loop
BBecause the function does not handle empty lists
CBecause the loop does not stop when temp equals head again
DBecause the loop condition should check temp->next, not temp
Attempts:
2 left
💡 Hint

Think about what happens when the list is circular and temp moves through nodes.

🧠 Conceptual
advanced
2:00remaining
Which method is best to detect a circular linked list efficiently?

Which of the following methods is the most efficient to detect if a linked list is circular?

ATraverse the list and check if any node's next pointer points to the head node
BUse two pointers moving at different speeds (slow and fast) to detect a cycle
CCount nodes and compare with a maximum limit to guess circularity
DStore visited nodes in an array and check for repeats
Attempts:
2 left
💡 Hint

Think about time and space efficiency.

❓ Predict Output
expert
2:00remaining
What is the output of this Floyd's cycle detection code on a circular list?

Given the code below implementing Floyd's cycle detection, what will it print for a circular linked list?

DSA C
#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node* next;
} Node;

int detectCycle(Node* head) {
    Node *slow = head, *fast = head;
    while (fast != NULL && fast->next != NULL) {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast) {
            return 1;
        }
    }
    return 0;
}

int main() {
    Node* head = (Node*)malloc(sizeof(Node));
    Node* second = (Node*)malloc(sizeof(Node));
    Node* third = (Node*)malloc(sizeof(Node));

    head->data = 1; head->next = second;
    second->data = 2; second->next = third;
    third->data = 3; third->next = head; // circular

    if (detectCycle(head)) {
        printf("Cycle Detected\n");
    } else {
        printf("No Cycle\n");
    }
    return 0;
}
ACycle Detected
BSegmentation fault
CNo Cycle
DInfinite loop
Attempts:
2 left
💡 Hint

Floyd's algorithm detects cycles by meeting slow and fast pointers.

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

  1. Step 1: Understand linked list structure

    A linked list is a chain of nodes where each node points to the next node.
  2. 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.
  3. Final Answer:

    The last node points back to one of the previous nodes, forming a loop -> Option A
  4. 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

  1. Step 1: Analyze code logic for circular detection

    The code moves through nodes until it finds the start node again, indicating a loop.
  2. 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.
  3. Final Answer:

    while (head != NULL) { head = head->next; if (head == start) return 1; } return 0; -> Option D
  4. 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?
typedef struct Node {
  int data;
  struct Node* next;
} Node;

int isCircular(Node* head) {
  if (head == NULL) return 0;
  Node* temp = head->next;
  while (temp != NULL && temp != head) {
    temp = temp->next;
  }
  return (temp == head);
}

int main() {
  Node a, b, c;
  a.data = 1; b.data = 2; c.data = 3;
  a.next = &b; b.next = &c; c.next = &a;
  printf("%d", isCircular(&a));
  return 0;
}
medium
A. Runtime error
B. 0
C. 1
D. Compilation error

Solution

  1. Step 1: Understand linked list setup

    Nodes a, b, c are linked in a circle: a->b->c->a.
  2. Step 2: Trace isCircular function

    Function moves temp pointer until it finds head again or NULL. Here, temp will reach head again, so returns 1.
  3. Final Answer:

    1 -> Option C
  4. 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

  1. Step 1: Understand Floyd's cycle detection setup

    Both slow and fast pointers should start at head to detect cycle properly.
  2. 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.
  3. Final Answer:

    fast pointer initialization should be head, not head->next -> Option B
  4. 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

  1. 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.
  2. Step 2: Apply Floyd's cycle detection algorithm

    Use slow and fast pointers starting at head to detect the cycle created.
  3. 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
  4. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard