Bird
Raised Fist0
DSA Cprogramming

Insert at Beginning of Circular Linked List in DSA C

Choose your learning style10 modes available
Mental Model
A circular linked list connects the last node back to the first, forming a loop. Inserting at the beginning means adding a new node before the current first node and updating the last node to point to this new node.
Analogy: Imagine people sitting in a circle holding hands. To add a new person at the start, you place them before the first person and make sure the last person now holds the new person's hand, keeping the circle unbroken.
Before insertion:
head -> 1 -> 2 -> 3 -> back to head (1)

After insertion of 0 at beginning:
head -> 0 -> 1 -> 2 -> 3 -> back to head (0)
Dry Run Walkthrough
Input: list: 1 -> 2 -> 3 (circular), insert value 0 at beginning
Goal: Add a new node with value 0 at the start and keep the list circular
Step 1: Create new node with value 0
new_node(0) -> null, list: 1 -> 2 -> 3 -> back to 1
Why: We need a new node to insert at the beginning
Step 2: Find last node (node with value 3) that points back to head (1)
1 -> 2 -> 3 -> [points to head(1)]
Why: To maintain circularity, last node must point to new head
Step 3: Set new_node.next to current head (1)
new_node(0) -> 1 -> 2 -> 3 -> back to 1
Why: New node should point to old first node
Step 4: Set last node's next to new_node (0)
1 -> 2 -> 3 -> new_node(0) -> 1 (circular)
Why: Last node must point to new first node to keep circle
Step 5: Update head pointer to new_node (0)
head -> 0 -> 1 -> 2 -> 3 -> back to 0
Why: Head must point to the new first node
Result:
head -> 0 -> 1 -> 2 -> 3 -> back to 0
Annotated Code
DSA C
#include <stdio.h>
#include <stdlib.h>

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

// Function to insert at beginning of circular linked list
void insertAtBeginning(Node** head_ref, int new_data) {
    Node* new_node = (Node*)malloc(sizeof(Node));
    new_node->data = new_data;

    if (*head_ref == NULL) {
        // List is empty: new node points to itself
        new_node->next = new_node;
        *head_ref = new_node;
        return;
    }

    // Find last node which points back to head
    Node* last = *head_ref;
    while (last->next != *head_ref) {
        last = last->next; // advance last to next node
    }

    // Insert new_node before head and update last's next
    new_node->next = *head_ref; // new node points to old head
    last->next = new_node;      // last node points to new node
    *head_ref = new_node;       // head updated to new node
}

// Function to print circular linked list
void printList(Node* head) {
    if (head == NULL) {
        printf("List is empty\n");
        return;
    }
    Node* temp = head;
    do {
        printf("%d -> ", temp->data);
        temp = temp->next;
    } while (temp != head);
    printf("back to %d\n", head->data);
}

int main() {
    Node* head = NULL;

    // Create initial list 1->2->3 circular
    insertAtBeginning(&head, 3);
    insertAtBeginning(&head, 2);
    insertAtBeginning(&head, 1);

    printf("Original list:\n");
    printList(head);

    // Insert 0 at beginning
    insertAtBeginning(&head, 0);

    printf("After inserting 0 at beginning:\n");
    printList(head);

    return 0;
}
while (last->next != *head_ref) { last = last->next; // advance last to next node }
advance last pointer to find the last node that points to head
new_node->next = *head_ref; // new node points to old head
link new node to current head to insert at beginning
last->next = new_node; // last node points to new node
update last node to point to new node to maintain circularity
*head_ref = new_node; // head updated to new node
update head pointer to new node as new first element
OutputSuccess
Original list: 1 -> 2 -> 3 -> back to 1 After inserting 0 at beginning: 0 -> 1 -> 2 -> 3 -> back to 0
Complexity Analysis
Time: O(n) because we must traverse the list to find the last node before insertion
Space: O(1) because insertion uses only a fixed amount of extra memory for the new node
vs Alternative: Compared to a singly linked list insertion at beginning which is O(1), circular list insertion requires O(n) to update the last node's pointer
Edge Cases
empty list
new node points to itself and becomes head, forming a single-node circular list
DSA C
if (*head_ref == NULL) {
        new_node->next = new_node;
        *head_ref = new_node;
        return;
    }
single node list
last node is the head itself; after insertion, last node points to new node and new node points to old head
DSA C
while (last->next != *head_ref) {
        last = last->next;
    }
When to Use This Pattern
When you see a problem asking to insert at the start of a circular linked list, remember you must update the last node's pointer to maintain the circle.
Common Mistakes
Mistake: Not updating the last node's next pointer to the new head, breaking the circular link
Fix: Always find the last node and set its next pointer to the new node after insertion
Summary
Inserts a new node at the start of a circular linked list and updates pointers to keep the circle intact.
Use when you need to add elements quickly at the beginning of a circular linked list.
The key is to update the last node's next pointer to the new head to maintain circularity.

Practice

(1/5)
1. What happens when you insert a new node at the beginning of a circular linked list?
easy
A. The new node is added at the end of the list, breaking the circular link.
B. The new node becomes the head and points to the old head, maintaining the circular link.
C. The new node replaces the last node in the list.
D. The list becomes a linear linked list instead of circular.

Solution

  1. Step 1: Understand the circular linked list structure

    A circular linked list has its last node pointing back to the head node, forming a circle.
  2. Step 2: Insert new node at beginning

    The new node is linked to the current head, and the last node's next pointer is updated to this new node, making it the new head.
  3. Final Answer:

    The new node becomes the head and points to the old head, maintaining the circular link. -> Option B
  4. Quick Check:

    New head points to old head, circle intact [OK]
Hint: New head points to old head; last node points to new head [OK]
Common Mistakes:
  • Forgetting to update last node's next pointer
  • Breaking the circular link by not connecting last node
  • Replacing the last node instead of adding new head
2. Which of the following is the correct syntax to create a new node and insert it at the beginning of a circular linked list in C?
easy
A. head = new_node; new_node->next = head; last->next = head;
B. head = new_node; new_node->next = last; last = head;
C. last->next = new_node; new_node->next = head; head = new_node;
D. new_node->next = NULL; head = new_node; last->next = NULL;

Solution

  1. Step 1: Link new node to current head

    Set new_node->next to head so new node points to old first node.
  2. Step 2: Update last node's next pointer and head

    Set last->next to new_node to maintain circular link, then update head to new_node.
  3. Final Answer:

    last->next = new_node; new_node->next = head; head = new_node; -> Option C
  4. Quick Check:

    New node links head and last points to new node [OK]
Hint: Link new node between last and head, then update head [OK]
Common Mistakes:
  • Setting new_node->next to NULL breaks circular link
  • Updating head before linking last node
  • Confusing order of pointer assignments
3. What will be the output of the following code snippet after inserting 10 at the beginning of the circular linked list?
struct Node {
  int data;
  struct Node* next;
};

// Existing list: 20 -> 30 -> 40 -> back to 20
struct Node* head = node20;
struct Node* last = node40;

// Insert 10 at beginning
struct Node* new_node = malloc(sizeof(struct Node));
new_node->data = 10;
new_node->next = head;
last->next = new_node;
head = new_node;

// Print list starting from head (print 4 nodes)
medium
A. 10 -> 20 -> 30 -> 40 -> back to 10
B. 20 -> 30 -> 40 -> 10 -> back to 20
C. 10 -> 30 -> 40 -> 20 -> back to 10
D. 30 -> 40 -> 20 -> 10 -> back to 30

Solution

  1. Step 1: Insert new node at beginning

    New node with data 10 points to old head (20), last node (40) points to new node, head updated to new node.
  2. Step 2: Print nodes starting from new head

    Printing 4 nodes from head: 10, 20, 30, 40, then back to 10.
  3. Final Answer:

    10 -> 20 -> 30 -> 40 -> back to 10 -> Option A
  4. Quick Check:

    New head 10 followed by old nodes in order [OK]
Hint: New node becomes head; last points to new head [OK]
Common Mistakes:
  • Not updating last->next to new node
  • Printing old head as start
  • Mixing node order after insertion
4. Identify the error in the following code that inserts a node at the beginning of a circular linked list:
void insertAtBeginning(struct Node** head, int data) {
  struct Node* new_node = malloc(sizeof(struct Node));
  new_node->data = data;
  new_node->next = *head;
  *head = new_node;
}
medium
A. The head pointer is not updated to new node.
B. The new node's data is not assigned correctly.
C. Memory allocation is missing for new node.
D. The last node's next pointer is not updated to new head, breaking circular link.

Solution

  1. Step 1: Check pointer updates

    The code updates head to new node and new node points to old head, but does not update last node's next pointer.
  2. Step 2: Understand circular link maintenance

    In circular linked list, last node must point to new head to keep circle intact; missing here causes broken link.
  3. Final Answer:

    The last node's next pointer is not updated to new head, breaking circular link. -> Option D
  4. Quick Check:

    Last node must point to new head [OK]
Hint: Always update last node's next to new head [OK]
Common Mistakes:
  • Ignoring last node pointer update
  • Assuming head update is enough
  • Not handling empty list case
5. You have a circular linked list with nodes: 5 -> 15 -> 25 -> back to 5. You want to insert 1 at the beginning. Which sequence of pointer updates correctly maintains the circular linked list?
hard
A. Create new node with 1, set last->next = new_node, new_node->next = head, head = new_node.
B. Create new node with 1, set head = new_node, new_node->next = head, update last->next = new_node.
C. Create new node with 1, set new_node->next = NULL, head = new_node, last->next = head.
D. Create new node with 1, set head = new_node, new_node->next = last, last->next = head.

Solution

  1. Step 1: Link new node between last and head

    Set last->next to new node, then new_node->next to old head to maintain circle.
  2. Step 2: Update head pointer

    Set head to new node so it becomes the first node in the list.
  3. Final Answer:

    Create new node with 1, set last->next = new_node, new_node->next = head, head = new_node. -> Option A
  4. Quick Check:

    Last points new node, new node points old head, head updated [OK]
Hint: Last points new node, new node points old head, update head last [OK]
Common Mistakes:
  • Setting new_node->next to NULL breaks circle
  • Updating head before linking last node
  • Confusing pointer order causing broken links
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