Reverse a Singly Linked List Iterative in DSA Go - Time & Space Complexity
We want to understand how the time needed to reverse a singly linked list changes as the list gets bigger.
How does the number of steps grow when the list length increases?
Analyze the time complexity of the following code snippet.
func reverseList(head *ListNode) *ListNode {
var prev *ListNode = nil
current := head
for current != nil {
nextTemp := current.Next
current.Next = prev
prev = current
current = nextTemp
}
return prev
}
This code reverses a singly linked list by changing the direction of the links one by one.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop that visits each node once.
- How many times: Exactly once per node, so n times for n nodes.
Each node is visited once, so the steps grow directly with the number of nodes.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 steps |
| 100 | About 100 steps |
| 1000 | About 1000 steps |
Pattern observation: The time grows linearly as the list gets longer.
Time Complexity: O(n)
This means the time to reverse the list grows in direct proportion to the number of nodes.
[X] Wrong: "Reversing a linked list takes constant time because we just change pointers."
[OK] Correct: Even though each pointer change is quick, we must do it for every node, so the total time grows with the list size.
Understanding this time complexity helps you explain why iterative reversal is efficient and expected in coding interviews.
"What if we used recursion instead of iteration? How would the time complexity change?"
Practice
Solution
Step 1: Understand the linked list structure
A singly linked list has nodes pointing to the next node only, so reversing means changing these pointers.Step 2: Purpose of iterative reversal
The iterative method changes the next pointer of each node to point to the previous node, reversing the list in place.Final Answer:
To change the direction of the links between nodes one by one -> Option DQuick Check:
Reversing means changing links direction [OK]
- Thinking it creates a new list instead of reversing in place
- Confusing reversal with sorting
- Assuming nodes are deleted and recreated
Solution
Step 1: Initialization for reversal
We start with prev as nil because the new tail will point to nil, and current at head to traverse the list.Step 2: Check each option
var prev *Node = nil; current := head correctly sets prev to nil and current to head. Others incorrectly assign prev or current.Final Answer:
var prev *Node = nil; current := head -> Option BQuick Check:
Prev starts nil, current at head [OK]
- Setting prev to head initially
- Setting current to nil at start
- Mixing pointer assignments
type Node struct {
Val int
Next *Node
}
func reverseList(head *Node) *Node {
var prev *Node = nil
current := head
for current != nil {
nextTemp := current.Next
current.Next = prev
prev = current
current = nextTemp
}
return prev
}
// Input list: 1 -> 2 -> 3 -> nil
// Call: reverseList(head)Solution
Step 1: Trace the reversal loop
Initially prev=nil, current=1. Each iteration reverses current.Next to prev and moves pointers forward.Step 2: Final reversed list
After loop, prev points to node with Val=3, linked as 3->2->1->nil.Final Answer:
3 -> 2 -> 1 -> nil -> Option AQuick Check:
Reversed list order is 3,2,1 [OK]
- Confusing original and reversed order
- Misunderstanding pointer updates
- Assuming list remains unchanged
func reverseList(head *Node) *Node {
var prev *Node = head
current := head
for current != nil {
nextTemp := current.Next
current.Next = prev
prev = current
current = nextTemp
}
return prev
}Solution
Step 1: Check initialization of prev
Prev must start as nil because the new tail's next is nil. Setting prev=head causes a cycle.Step 2: Effect of wrong prev initialization
Setting prev=head makes current.Next point to itself on first iteration, causing infinite loop or wrong reversal.Final Answer:
prev should be initialized to nil, not head -> Option AQuick Check:
Prev starts nil to avoid cycles [OK]
- Initializing prev to head causing cycles
- Returning current instead of prev
- Misplacing nextTemp initialization
Solution
Step 1: First reversal
Reversing 10->20->30->40->nil gives 40->30->20->10->nil.Step 2: Second reversal
Reversing again restores original order: 10->20->30->40->nil.Final Answer:
10 -> 20 -> 30 -> 40 -> nil -> Option CQuick Check:
Double reversal returns original list [OK]
- Assuming second reversal changes order differently
- Confusing node values after reversal
- Thinking list becomes empty
Ready to prove it?
Pass the test and this pattern moves unknown
