Bird
Raised Fist0
DSA Cprogramming

Create a Circular Singly Linked List in DSA C

Choose your learning style10 modes available
Mental Model
A circular singly linked list is like a chain where the last link connects back to the first, making a loop.
Analogy: Imagine a round table where each person holds hands with the next, and the last person holds hands with the first, so everyone forms a circle.
head -> [1] -> [2] -> [3] ->
          ↑               ↓
          ← ← ← ← ← ← ← ← ←
Dry Run Walkthrough
Input: Create a circular singly linked list with nodes 1, 2, 3 in order
Goal: Build a linked list where the last node points back to the first node, forming a circle
Step 1: Create node with value 1 and set head to it
head -> [1] -> null
Why: Start the list with the first node
Step 2: Create node with value 2 and link it after node 1
head -> [1] -> [2] -> null
Why: Add second node to the list
Step 3: Create node with value 3 and link it after node 2
head -> [1] -> [2] -> [3] -> null
Why: Add third node to the list
Step 4: Make node 3 point back to head node 1
head -> [1] -> [2] -> [3] -> head (1)
Why: Close the loop to form a circular list
Result:
head -> [1] -> [2] -> [3] -> head (1)
Annotated Code
DSA C
#include <stdio.h>
#include <stdlib.h>

// Node structure for circular singly linked list
typedef struct Node {
    int data;
    struct Node* next;
} Node;

// Function to create a circular singly linked list with given array of values
Node* createCircularList(int arr[], int n) {
    if (n == 0) return NULL; // empty list

    Node* head = (Node*)malloc(sizeof(Node));
    head->data = arr[0];
    Node* curr = head;

    // Create and link nodes for remaining elements
    for (int i = 1; i < n; i++) {
        Node* newNode = (Node*)malloc(sizeof(Node));
        newNode->data = arr[i];
        curr->next = newNode; // link current node to new node
        curr = newNode;       // move current pointer forward
    }

    curr->next = head; // last node points back to head to form circle
    return head;
}

// Function to print circular singly linked list
void printCircularList(Node* head) {
    if (head == NULL) {
        printf("List is empty\n");
        return;
    }

    Node* curr = head;
    do {
        printf("%d -> ", curr->data);
        curr = curr->next;
    } while (curr != head);
    printf("(back to head)\n");
}

int main() {
    int values[] = {1, 2, 3};
    int n = sizeof(values) / sizeof(values[0]);

    Node* circularList = createCircularList(values, n);
    printCircularList(circularList);

    return 0;
}
if (n == 0) return NULL; // empty list
handle empty input array by returning NULL
head->data = arr[0];
initialize head node with first element
curr->next = newNode; // link current node to new node
link previous node to new node to extend list
curr = newNode; // move current pointer forward
advance current pointer to newly added node
curr->next = head; // last node points back to head to form circle
close the list by linking last node back to head
do { ... } while (curr != head);
traverse and print nodes until we loop back to head
OutputSuccess
1 -> 2 -> 3 -> (back to head)
Complexity Analysis
Time: O(n) because we create and link each of the n nodes once
Space: O(n) because we allocate memory for n nodes
vs Alternative: Compared to a linear singly linked list, circular list requires one extra pointer assignment to close the loop, but traversal can be infinite if not careful
Edge Cases
empty input array
function returns NULL and prints 'List is empty'
DSA C
if (n == 0) return NULL; // empty list
single element array
creates one node that points to itself forming a single-node circle
DSA C
curr->next = head; // last node points back to head to form circle
When to Use This Pattern
When you need a list where you can cycle through elements repeatedly without stopping, use a circular singly linked list to avoid null ends.
Common Mistakes
Mistake: Forgetting to link the last node back to the head, leaving the list linear
Fix: Add the line 'curr->next = head;' after creating all nodes to close the circle
Mistake: Using a while loop that checks for NULL to print nodes, causing infinite loop in circular list
Fix: Use a do-while loop that stops when current node returns to head
Summary
Creates a linked list where the last node points back to the first, forming a circle.
Use when you want to cycle through elements endlessly without a null end.
The key is linking the last node back to the head to close the loop.

Practice

(1/5)
1. What is a key characteristic of a circular singly linked list compared to a regular singly linked list?
easy
A. The last node points back to the first node, forming a circle.
B. Each node has two pointers, one to the next and one to the previous node.
C. It uses an array internally to store nodes.
D. The list ends with a null pointer indicating the end.

Solution

  1. Step 1: Understand the pointer structure in circular singly linked list

    In a circular singly linked list, the last node's next pointer points back to the first node, creating a loop.
  2. Step 2: Compare with regular singly linked list

    Regular singly linked lists end with a null pointer, while circular ones loop back to the start.
  3. Final Answer:

    The last node points back to the first node, forming a circle. -> Option A
  4. Quick Check:

    Circular list last node points to head = C [OK]
Hint: Remember: circular means last node links back to first [OK]
Common Mistakes:
  • Thinking circular list ends with null pointer
  • Confusing circular singly linked list with doubly linked list
  • Assuming nodes have two pointers in singly linked list
2. Which of the following is the correct way to initialize a circular singly linked list with one node in C?
easy
A. node->next = head->next;
B. node->next = NULL;
C. node->next = node;
D. node->next = 0;

Solution

  1. Step 1: Understand initialization of single node circular list

    For a circular singly linked list with one node, the node's next pointer must point to itself to form a circle.
  2. Step 2: Check each option

    node->next = node; sets node->next = node, correctly creating a self-loop. Others either set null or incorrect pointers.
  3. Final Answer:

    node->next = node; -> Option C
  4. Quick Check:

    Single node points to itself = A [OK]
Hint: Single node circular list points to itself [OK]
Common Mistakes:
  • Setting next pointer to NULL instead of self
  • Using uninitialized pointers
  • Confusing NULL with 0 in pointer context
3. Consider the following C code snippet that creates a circular singly linked list with three nodes. What will be the output of the print loop?
typedef struct Node {
  int data;
  struct Node* next;
} Node;

int main() {
  Node n1 = {1, NULL};
  Node n2 = {2, NULL};
  Node n3 = {3, NULL};

  n1.next = &n2;
  n2.next = &n3;
  n3.next = &n1;  // circular link

  Node* temp = &n1;
  int count = 0;
  while (count < 5) {
    printf("%d ", temp->data);
    temp = temp->next;
    count++;
  }
  return 0;
}
medium
A. 1 2 3 3 3
B. 1 2 3 2 3
C. 1 2 3 1 1
D. 1 2 3 1 2

Solution

  1. Step 1: Trace the linked list nodes and their next pointers

    n1 points to n2, n2 points to n3, n3 points back to n1, forming a circle: 1 -> 2 -> 3 -> 1 ...
  2. Step 2: Follow the print loop for 5 iterations

    Print order: 1 (n1), 2 (n2), 3 (n3), 1 (n1 again), 2 (n2 again).
  3. Final Answer:

    1 2 3 1 2 -> Option D
  4. Quick Check:

    Loop prints nodes in circle: 1 2 3 1 2 [OK]
Hint: Follow next pointers in circle for given count [OK]
Common Mistakes:
  • Stopping after 3 nodes instead of 5
  • Not following circular link back to first node
  • Confusing node data values
4. The following code attempts to create a circular singly linked list with two nodes. What is the error?
typedef struct Node {
  int data;
  struct Node* next;
} Node;

int main() {
  Node* n1 = malloc(sizeof(Node));
  Node* n2 = malloc(sizeof(Node));
  n1->data = 10;
  n2->data = 20;
  n1->next = n2;
  n2->next = NULL;  // mistake here
  return 0;
}
medium
A. Memory allocation is missing for nodes.
B. n2->next should point to n1 to make the list circular.
C. Data values are not initialized correctly.
D. n1->next should be NULL instead of n2.

Solution

  1. Step 1: Identify the circular link requirement

    In a circular singly linked list, the last node's next pointer must point back to the first node.
  2. Step 2: Check the code's next pointers

    n1->next points to n2, but n2->next is NULL, breaking the circle. It should point to n1.
  3. Final Answer:

    n2->next should point to n1 to make the list circular. -> Option B
  4. Quick Check:

    Last node next points to head = D [OK]
Hint: Last node's next must link to first node [OK]
Common Mistakes:
  • Setting last node next to NULL instead of head
  • Forgetting to allocate memory for nodes
  • Mixing up which node points where
5. You want to insert a new node with data 5 at the end of an existing circular singly linked list. The list currently has nodes 1 -> 2 -> 3 -> (back to 1). Which steps correctly insert the new node to maintain the circular structure?
hard
A. Create new node; set new_node->next = head; find last node; set last_node->next = new_node;
B. Create new node; set new_node->next = NULL; find last node; set last_node->next = new_node;
C. Create new node; set new_node->next = last_node; set head = new_node;
D. Create new node; set new_node->next = head->next; set head->next = new_node;

Solution

  1. Step 1: Create new node and link it to head

    The new node's next pointer must point to the head to keep the circle intact.
  2. Step 2: Find the last node and update its next pointer

    Traverse the list to find the last node (which points to head), then set last_node->next to new_node.
  3. Final Answer:

    Create new node; set new_node->next = head; find last node; set last_node->next = new_node; -> Option A
  4. Quick Check:

    New node next = head, last node next = new node = A [OK]
Hint: New node next points to head; last node next points to new node [OK]
Common Mistakes:
  • Setting new node next to NULL breaks circularity
  • Not updating last node's next pointer
  • Confusing head and last node pointers
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