Insert at Beginning of Circular Linked List in DSA Java - Time & Space Complexity
We want to understand how the time to insert a new node at the start of a circular linked list changes as the list grows.
How does the number of steps needed grow when the list gets bigger?
Analyze the time complexity of the following code snippet.
class Node {
int data;
Node next;
Node(int d) { data = d; next = null; }
}
Node insertAtBeginning(Node head, int data) {
Node newNode = new Node(data);
if (head == null) {
newNode.next = newNode;
return newNode;
}
Node temp = head;
while (temp.next != head) {
temp = temp.next;
}
temp.next = newNode;
newNode.next = head;
return newNode;
}
This code inserts a new node at the start of a circular linked list by first finding the last node, then linking the new node before the head.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop that moves through the list to find the last node.
- How many times: It runs once for each node until it reaches the last node, so roughly n times where n is the number of nodes.
As the list grows, the loop takes longer because it must check each node to find the last one.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 steps to find last node |
| 100 | About 100 steps to find last node |
| 1000 | About 1000 steps to find last node |
Pattern observation: The number of steps grows directly with the number of nodes. Double the nodes, double the steps.
Time Complexity: O(n)
This means the time to insert at the beginning grows linearly with the list size because we must find the last node each time.
[X] Wrong: "Inserting at the beginning is always fast and takes constant time."
[OK] Correct: In a circular linked list, we must find the last node to update its pointer, which takes time proportional to the list size.
Understanding this helps you explain how linked list operations depend on structure and why some insertions are slower than others.
"What if we kept a pointer to the last node? How would the time complexity change for insertion at the beginning?"
Practice
Solution
Step 1: Understand the circular linked list structure
In a circular linked list, the last node points back to the head node, forming a circle.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.Final Answer:
The new node becomes the head and points to the old head, maintaining the circular link. -> Option AQuick Check:
New head points to old head, circle intact = C [OK]
- Forgetting to update last node's next pointer
- Breaking the circular link by not linking last node
- Replacing last node instead of adding new head
Solution
Step 1: Link new node to current head
Set newNode.next = head to point new node to the current head.Step 2: Update last node's next to new node and move head
Set last.next = newNode to maintain circular link, then update head = newNode.Final Answer:
newNode.next = head; last.next = newNode; head = newNode; -> Option DQuick Check:
Correct pointer updates = A [OK]
- Setting newNode.next to null breaks circular link
- Not updating last.next to new node
- Incorrect order of pointer updates
class Node {
int data;
Node next;
Node(int d) { data = d; next = null; }
}
Node head = new Node(20);
Node second = new Node(30);
head.next = second;
second.next = head; // circular link
Node newNode = new Node(10);
// Insert at beginning
newNode.next = head;
second.next = newNode;
head = newNode;
// Print list starting from head
Node temp = head;
do {
System.out.print(temp.data + " -> ");
temp = temp.next;
} while(temp != head);
System.out.print("null");Solution
Step 1: Understand initial list and insertion
Initial list: 20 -> 30 -> back to 20. New node 10 inserted at beginning, so head moves to 10.Step 2: Trace the print loop
Starting at head (10), print 10, then 20, then 30, then loop ends at head again.Final Answer:
10 -> 20 -> 30 -> null -> Option AQuick Check:
New head 10 followed by old nodes = D [OK]
- Printing nodes in wrong order
- Not updating last node's next pointer
- Confusing circular link with null termination
Node newNode = new Node(5); newNode.next = head; head = newNode; // Missing update of last node's next pointer
Solution
Step 1: Check pointer updates after insertion
New node points to old head, and head is updated, but last node still points to old head.Step 2: Identify circular link break
Since last node's next is not updated to new head, the circular link breaks, causing incorrect list traversal.Final Answer:
The last node's next pointer is not updated to point to the new head, breaking the circular link. -> Option CQuick Check:
Last node must point to new head to keep circle [OK]
- Forgetting to update last node's next pointer
- Assuming head update is enough
- Not maintaining circular property
Solution
Step 1: Insert new node at beginning
New node with value 1 points to old head (5), and last node (25) points to new node.Step 2: Update head pointer
Head is updated to new node (1), so traversal starts from 1.Final Answer:
1 -> 5 -> 15 -> 25 -> null -> Option BQuick Check:
New head 1 followed by old nodes in order [OK]
- Not updating last node's next pointer
- Incorrect order of nodes after insertion
- Confusing circular list with linear list
Ready to prove it?
Pass the test and this pattern moves unknown
