Reverse a Doubly Linked List in DSA Javascript - Time & Space Complexity
We want to understand how the time needed to reverse a doubly linked list changes as the list grows.
How does the number of steps grow when the list gets longer?
Analyze the time complexity of the following code snippet.
function reverseDoublyLinkedList(head) {
let current = head;
let temp = null;
while (current !== null) {
temp = current.prev;
current.prev = current.next;
current.next = temp;
current = current.prev;
}
if (temp !== null) {
head = temp.prev;
}
return head;
}
This code reverses the links of a doubly linked list by swapping the previous and next pointers for each node.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop that visits each node once.
- How many times: Exactly once per node, so as many times as there are nodes in the list.
As the list gets longer, the number of steps grows directly with the number of nodes.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 swaps of pointers |
| 100 | About 100 swaps of pointers |
| 1000 | About 1000 swaps of pointers |
Pattern observation: The work grows in a straight line with the size of the list.
Time Complexity: O(n)
This means the time to reverse the list grows directly in proportion to the number of nodes.
[X] Wrong: "Reversing a doubly linked list takes more than linear time because of the two pointers per node."
[OK] Correct: Each node is visited only once, and swapping two pointers is a constant time operation, so the total time still grows linearly.
Understanding this helps you explain how to efficiently reverse linked structures, a common task in coding challenges and real applications.
"What if we tried to reverse a singly linked list instead? How would the time complexity change?"
Practice
Solution
Step 1: Understand doubly linked list structure
Each node has two pointers: one to the next node and one to the previous node.Step 2: Reverse means swapping pointers
Reversing means changing each node's next pointer to previous and previous pointer to next.Final Answer:
Swapping the next and previous pointers of each node -> Option DQuick Check:
Reverse = swap next and prev pointers [OK]
- Thinking reverse means deleting nodes
- Confusing reverse with sorting
- Adding nodes instead of reversing pointers
Solution
Step 1: Use a temporary variable to hold one pointer
Store node.next in temp to avoid losing its value.Step 2: Swap pointers correctly
Assign node.next = node.prev, then node.prev = temp to complete swap.Final Answer:
let temp = node.next; node.next = node.prev; node.prev = temp; -> Option CQuick Check:
Swap with temp variable = correct [OK]
- Swapping without temp loses pointer data
- Assigning both pointers to same value
- Not swapping pointers at all
Head -> 1 <-> 2 <-> 3 <-> null
After reversal, what is the new head node's value?
Solution
Step 1: Original list order
List is 1 <-> 2 <-> 3, head points to 1.Step 2: Reverse swaps pointers, so last node becomes head
After reversal, 3 becomes the new head, pointing backward to 2 and forward to null.Final Answer:
3 -> Option AQuick Check:
New head after reverse = last node = 3 [OK]
- Assuming head stays same after reverse
- Confusing node values order
- Thinking null becomes head
function reverse(head) {
let current = head;
while (current != null) {
let temp = current.next;
current.next = current.prev;
current.prev = temp;
current = current.next;
}
return head;
}Solution
Step 1: Check pointer swapping
Swapping next and prev pointers is done correctly using temp variable.Step 2: Check head update after reversal
Function returns original head, but after reversal head should be last node visited, so head is not updated.Final Answer:
The function does not update the head to the new first node -> Option AQuick Check:
Head must update to new first node [OK]
- Not updating head after reversal
- Incorrect loop condition causing infinite loop
- Returning wrong node at end
Head -> 10 <-> 20 <-> 30 <-> 40 <-> null
After reversing the list, what is the correct sequence of nodes starting from the new head?
Solution
Step 1: Original list order
Nodes are linked as 10 <-> 20 <-> 30 <-> 40, head at 10.Step 2: Reverse swaps pointers and changes head to last node
After reversal, head is 40, and nodes link backward as 40 <-> 30 <-> 20 <-> 10.Final Answer:
40 <-> 30 <-> 20 <-> 10 <-> null -> Option BQuick Check:
Reverse list order = original tail to head [OK]
- Not reversing the order correctly
- Mixing node values in wrong order
- Confusing null placement in list
Ready to prove it?
Pass the test and this pattern moves unknown
