Insert at Specific Position in Doubly Linked List in DSA C - Time & Space Complexity
When inserting a new node at a specific position in a doubly linked list, we want to know how the time needed changes as the list grows.
We ask: How many steps does it take to find the right spot and insert the node?
Analyze the time complexity of the following code snippet.
void insertAtPosition(Node** head, int data, int pos) {
Node* newNode = malloc(sizeof(Node));
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
if (pos == 1) {
newNode->next = *head;
if (*head) (*head)->prev = newNode;
*head = newNode;
return;
}
Node* temp = *head;
for (int i = 1; i < pos - 1 && temp != NULL; i++) {
temp = temp->next;
}
if (temp == NULL) return; // position out of bounds
newNode->next = temp->next;
if (temp->next) temp->next->prev = newNode;
temp->next = newNode;
newNode->prev = temp;
}
This code inserts a new node at a given position by first moving through the list to find the correct spot, then adjusting pointers.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop that moves through the list nodes to reach the position before insertion.
- How many times: Up to (pos - 2) times, depending on the position where we insert.
As the list gets longer, the time to reach the insertion point grows roughly in direct proportion to the position number.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | Up to 9 steps to reach position |
| 100 | Up to 99 steps to reach position |
| 1000 | Up to 999 steps to reach position |
Pattern observation: The time grows linearly with the position number, so doubling the list size roughly doubles the steps needed.
Time Complexity: O(n)
This means the time to insert grows in a straight line with the list size or the position where we insert.
[X] Wrong: "Inserting at any position in a doubly linked list always takes constant time O(1)."
[OK] Correct: You must first find the position by moving through the list, which takes time proportional to the position number, so it is not always instant.
Understanding how insertion time depends on position helps you explain trade-offs in linked list operations clearly and confidently.
"What if we kept a pointer to the tail of the list and wanted to insert near the end? How would the time complexity change?"
Practice
Solution
Step 1: Understand position 1 insertion
Inserting at position 1 means adding the node at the start of the list.Step 2: Effect on head pointer
The new node becomes the head, and its next points to the old head.Final Answer:
The new node becomes the new head of the list. -> Option AQuick Check:
Position 1 insertion updates head [OK]
- Thinking position 1 means end insertion
- Not updating the head pointer
- Ignoring previous pointer updates
Solution
Step 1: Identify insertion point
At position 3, newNode is inserted after temp (node at position 2).Step 2: Update pointers correctly
newNode's next points to temp's next, prev to temp; temp's next's prev updated to newNode; temp's next updated to newNode.Final Answer:
newNode->next = temp->next; newNode->prev = temp; temp->next->prev = newNode; temp->next = newNode; -> Option CQuick Check:
Correct pointer updates for middle insertion [OK]
- Swapping next and prev pointers
- Not updating temp->next->prev
- Forgetting to update temp->next
Solution
Step 1: Locate position 2
Position 2 means new node goes between nodes 1 (5) and 2 (15).Step 2: Insert new node with value 10
New node's prev points to 5, next points to 15; update 5's next and 15's prev accordingly.Final Answer:
5 <-> 10 <-> 15 <-> 20 -> Option DQuick Check:
Inserted node at position 2 between 5 and 15 [OK]
- Inserting at wrong position
- Not updating both next and prev pointers
- Appending instead of inserting
void insertAtPosition(Node** head, int data, int pos) {
Node* newNode = createNode(data);
Node* temp = *head;
for (int i = 1; i < pos - 1; i++) {
temp = temp->next;
}
newNode->next = temp->next;
newNode->prev = temp;
temp->next->prev = newNode;
temp->next = newNode;
}Solution
Step 1: Analyze loop for position 4 in 3-node list
Loop moves temp to node at position 3; temp->next is NULL (end of list).Step 2: Check pointer updates
Accessing temp->next->prev causes runtime error because temp->next is NULL.Final Answer:
temp->next is NULL, so temp->next->prev causes a runtime error. -> Option BQuick Check:
Accessing NULL pointer causes runtime error [OK]
- Not checking if temp->next is NULL
- Assuming list is longer than it is
- Ignoring edge case at list end
Solution
Step 1: Identify insertion position and nodes
Position 3 means new node goes between nodes with values 3 (pos 2) and 5 (pos 3).Step 2: Update pointers to insert new node
Set newNode->prev to node with value 3, newNode->next to node with value 5; update node 3's next and node 5's prev to newNode.Step 3: Verify list integrity
After insertion, list is 1 <-> 3 <-> 4 <-> 5 <-> 7 with all pointers correctly linked.Final Answer:
1 <-> 3 <-> 4 <-> 5 <-> 7; Set newNode->prev = node at pos 2, newNode->next = node at pos 3, update adjacent nodes' pointers. -> Option AQuick Check:
Proper pointer updates maintain doubly linked list [OK]
- Inserting at wrong position
- Not updating both adjacent nodes' pointers
- Breaking list links causing traversal errors
Ready to prove it?
Pass the test and this pattern moves unknown
