Insert at Middle Specific Position in DSA Go - Time & Space Complexity
When we insert an element at a specific middle position in a list, the time it takes depends on how far we need to go to reach that position.
We want to know how the time grows as the list gets bigger.
Analyze the time complexity of the following code snippet.
func InsertAtMiddle(head *Node, data int, pos int) *Node {
newNode := &Node{data: data}
if pos == 0 {
newNode.next = head
return newNode
}
current := head
for i := 0; i < pos-1; i++ {
current = current.next
}
newNode.next = current.next
current.next = newNode
return head
}
This code inserts a new node with given data at a specific position in a singly linked list.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop that moves through the list to reach the position before insertion.
- How many times: It runs (pos - 1) times, which depends on the position where we insert.
As the list grows, the time to reach the middle position grows roughly in proportion to the position number.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 5 steps to reach middle |
| 100 | About 50 steps to reach middle |
| 1000 | About 500 steps to reach middle |
Pattern observation: The steps increase linearly as the list size increases.
Time Complexity: O(n)
This means the time to insert grows in a straight line with the size of the list.
[X] Wrong: "Inserting at the middle is always very fast, like constant time."
[OK] Correct: Because we must walk through the list to reach the middle, the time depends on the position, so it grows with the list size.
Understanding how insertion time changes with list size helps you explain your code clearly and shows you know how data structures behave in real situations.
"What if we kept a pointer to the middle node? How would the time complexity change when inserting at the middle?"
Practice
Solution
Step 1: Understand linked list positions
Positions in a linked list start from 1 at the head and increase by 1 for each node.Step 2: Define middle insertion
Inserting at a middle position means placing a new node between two existing nodes at that position.Final Answer:
Adding a new node exactly between two existing nodes at a given position -> Option CQuick Check:
Middle insertion = Insert between nodes [OK]
- Confusing insertion with deletion
- Thinking insertion only happens at start or end
- Ignoring position indexing starting at 1
Solution
Step 1: Loop to node before position 3
To insert at position 3, loop until position 2 (i < 2) to get node before insertion point.Step 2: Adjust pointers correctly
Set newNode.next to temp.next, then temp.next to newNode to insert newNode at position 3.Final Answer:
Code snippet in option A correctly inserts at position 3 -> Option AQuick Check:
Loop to position-1, then insert [OK]
- Looping too many times and skipping nodes
- Setting pointers in wrong order causing lost nodes
- Using wrong loop conditions (<= instead of <)
type Node struct {
val int
next *Node
}
head := &Node{10, &Node{20, &Node{30, nil}}}
newNode := &Node{99, nil}
temp := head
for i := 1; i < 1; i++ {
temp = temp.next
}
newNode.next = temp.next
temp.next = newNode
Solution
Step 1: Loop runs zero times to position 1 node
The loop condition i < 1 means no iteration; temp stays at head (value 10).Step 2: Insert newNode after temp
newNode.next points to temp.next (node with 20), then temp.next points to newNode, inserting 99 after 10.Final Answer:
10 -> 99 -> 20 -> 30 -> null -> Option AQuick Check:
Insert after position 1 = position 2 [OK]
- Misunderstanding loop range causing wrong insertion
- Confusing head node position as 0 instead of 1
- Incorrect pointer assignments losing nodes
temp := head
for i := 1; i <= 4; i++ {
temp = temp.next
}
newNode.next = temp.next
temp.next = newNode
Solution
Step 1: Analyze loop iterations
The loop runs from i=1 to i=4 inclusive, moving temp 4 times forward.Step 2: Check list length and temp value
List length is 3, so after 3 moves temp becomes nil; moving one more causes panic on temp.next.Final Answer:
Loop runs too many times causing temp to be nil and panic -> Option DQuick Check:
Loop beyond list length = nil pointer error [OK]
- Looping beyond list length causing runtime errors
- Not checking for nil before accessing next
- Confusing <= with < in loop condition
Solution
Step 1: Check position against list length
List length is 4; position 5 is length+1, so insert at end.Step 2: Insert new node at end
Traverse to last node (40), set its next to new node with value 50, new node next is nil.Final Answer:
10 -> 20 -> 30 -> 40 -> 50 -> null -> Option BQuick Check:
Position > length = insert at end [OK]
- Trying to insert beyond list length without appending
- Misplacing new node in middle instead of end
- Not handling nil next pointer at list end
Ready to prove it?
Pass the test and this pattern moves unknown
