Bird
Raised Fist0
DSA Typescriptprogramming~10 mins

Reverse a Doubly Linked List in DSA Typescript - Execution Trace

Choose your learning style10 modes available
Concept Flow - Reverse a Doubly Linked List
Start at head node
↓
Swap node.prev and node.next
↓
Move to node.prev (old next)
↓
Repeat until node is null
↓
Update head to last processed node
↓
Done: list reversed
We start at the head and for each node, swap its previous and next pointers. Then move to the old next node (now prev). Repeat until all nodes are processed, then update the head.
Execution Sample
DSA Typescript
function reverseDoublyLinkedList(head) {
  let current = head;
  let temp = null;
  while (current) {
    temp = current.prev;
    current.prev = current.next;
    current.next = temp;
    current = current.prev;
  }
  if (temp) head = temp.prev;
  return head;
}
This code reverses the doubly linked list by swapping prev and next pointers for each node and updating the head at the end.
Execution Table
StepOperationCurrent NodePointer ChangesVisual State
1Start at head (1)Node 1None1 <-> 2 <-> 3 <-> null
2Swap prev and next of Node 1Node 1prev: null -> 2, next: 2 -> null1 <- 2 <-> 3 <-> null
3Move current to old next (now prev) Node 2Node 2None1 <- 2 <-> 3 <-> null
4Swap prev and next of Node 2Node 2prev: 1 -> 3, next: 3 -> 11 <- 2 <- 3 <-> null
5Move current to old next (now prev) Node 3Node 3None1 <- 2 <- 3 <-> null
6Swap prev and next of Node 3Node 3prev: 2 -> null, next: null -> 21 <- 2 <- 3
7Move current to old next (now prev) nullnullNone1 <- 2 <- 3
8Update head to last processed node (Node 3)Node 3head: Node 1 -> Node 33 <-> 2 <-> 1 <-> null
9Return new headNode 3None3 <-> 2 <-> 1 <-> null
💡 current becomes null after processing all nodes, loop ends
Variable Tracker
VariableStartAfter Step 2After Step 4After Step 6Final
currentNode 1Node 2Node 3nullnull
tempnullnullNode 1Node 2Node 2
headNode 1Node 1Node 1Node 1Node 3
Key Moments - 3 Insights
Why do we move current to current.prev after swapping pointers?
After swapping, current.prev points to the original next node. Moving current to current.prev continues traversal forward in the original list, as shown in execution_table steps 3, 5, and 7.
Why do we update head to temp.prev at the end?
temp holds the previous node before current became null. temp.prev is the last processed node, which becomes the new head after reversal, as shown in step 8.
What happens if the list is empty (head is null)?
The while loop never runs because current is null initially, so the function returns null immediately, meaning the list remains empty.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the visual state after step 4?
A1 <- 2 <-> 3 <-> null
B1 <-> 2 <-> 3 <-> null
C1 <- 2 <- 3 <-> null
D3 <-> 2 <-> 1 <-> null
💡 Hint
Check the 'Visual State' column in row for step 4.
At which step does current become null, ending the loop?
AStep 6
BStep 7
CStep 8
DStep 9
💡 Hint
Look at the 'Current Node' column and find when it is 'null'.
If we forget to update head to temp.prev at the end, what will be the head after reversal?
ANode 3 (new head)
Bnull
CNode 1 (original head)
DNode 2
💡 Hint
Refer to variable_tracker 'head' values and step 8 in execution_table.
Concept Snapshot
Reverse a Doubly Linked List:
- Start at head node
- For each node, swap prev and next pointers
- Move to old next node (now prev)
- Repeat until current is null
- Update head to last processed node
- Return new head
Full Transcript
To reverse a doubly linked list, we start at the head node. For each node, we swap its prev and next pointers. Then we move to the node that was originally next, which after swapping is current.prev. We repeat this until current becomes null, meaning we processed all nodes. Finally, we update the head pointer to the last processed node, which is stored in temp.prev. This process reverses the direction of the list. If the list is empty, the function returns null immediately. This method ensures the list is reversed in place without creating new nodes.

Practice

(1/5)
1. What is the main purpose of reversing a doubly linked list?
easy
A. To sort the nodes in ascending order
B. To reverse the order of nodes so the last becomes first and vice versa
C. To delete all nodes from the list
D. To convert it into a singly linked list

Solution

  1. Step 1: Understand the structure of a doubly linked list

    A doubly linked list has nodes with pointers to both previous and next nodes.
  2. Step 2: Purpose of reversing

    Reversing swaps the direction so the last node becomes the first and the first becomes the last.
  3. Final Answer:

    To reverse the order of nodes so the last becomes first and vice versa -> Option B
  4. Quick Check:

    Reversing = changing node order [OK]
Hint: Reversing flips the list order, not deleting or sorting [OK]
Common Mistakes:
  • Confusing reversing with deleting nodes
  • Thinking reversing sorts the list
  • Assuming it converts to singly linked list
2. Which of the following TypeScript code snippets correctly swaps the next and prev pointers of a node in a doubly linked list?
easy
A. let temp = node.next; node.next = node.prev; node.prev = temp;
B. node.next = node.next; node.prev = node.prev;
C. node.prev = node.next; node.next = node.prev;
D. let temp = node.prev; node.prev = node.next; node.next = temp.next;

Solution

  1. Step 1: Identify correct swapping logic

    Swapping pointers requires a temporary variable to hold one pointer before assignment.
  2. Step 2: Check each option

    let temp = node.next; node.next = node.prev; node.prev = temp; correctly uses a temp variable to swap next and prev. Others either assign incorrectly or lose references.
  3. Final Answer:

    let temp = node.next; node.next = node.prev; node.prev = temp; -> Option A
  4. Quick Check:

    Swap pointers using temp variable [OK]
Hint: Use a temp variable to swap pointers safely [OK]
Common Mistakes:
  • Assigning pointers without temp causes data loss
  • Mixing up next and prev assignments
  • Using incorrect pointer references
3. What will be the output of the following TypeScript code that reverses a doubly linked list?
class Node {
  data: number;
  next: Node | null = null;
  prev: Node | null = null;
  constructor(data: number) { this.data = data; }
}

function reverse(head: Node | null): Node | null {
  let current = head;
  let temp: Node | null = 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;
}

// Create list: 1 <-> 2 <-> 3
const n1 = new Node(1);
const n2 = new Node(2);
n1.next = n2; n2.prev = n1;
const n3 = new Node(3);
n2.next = n3; n3.prev = n2;

const newHead = reverse(n1);

// Print reversed list
let result = [];
let node = newHead;
while (node !== null) {
  result.push(node.data);
  node = node.next;
}
console.log(result);
medium
A. []
B. [1, 2, 3]
C. [3, 2, 1]
D. [3, 1, 2]

Solution

  1. Step 1: Trace pointer swaps in the loop

    Each node swaps its next and prev. The loop moves forward using the old next pointer now in prev.
  2. Step 2: Update head to new first node

    After loop, head is updated to last node processed, which is node with data 3.
  3. Final Answer:

    [3, 2, 1] -> Option C
  4. Quick Check:

    Reversed list order = [3, 2, 1] [OK]
Hint: Reversing swaps pointers and updates head to last node [OK]
Common Mistakes:
  • Not updating head after reversal
  • Confusing next and prev in loop
  • Printing original list order
4. Identify the bug in this TypeScript function that attempts to reverse a doubly linked list:
function reverse(head: Node | null): Node | null {
  let current = head;
  while (current !== null) {
    let temp = current.next;
    current.next = current.prev;
    current.prev = temp;
    current = current.next;
  }
  return head;
}
medium
A. The function should return current instead of head
B. The pointers next and prev are swapped incorrectly
C. The loop condition should be current.next !== null
D. The function does not update the head to the new first node after reversal

Solution

  1. Step 1: Check pointer swapping logic

    The swapping of next and prev is correct using a temp variable.
  2. Step 2: Verify head update after reversal

    The function returns original head without updating it to the new first node, so the reversed list head is incorrect.
  3. Final Answer:

    The function does not update the head to the new first node after reversal -> Option D
  4. Quick Check:

    Head must update to new first node [OK]
Hint: Always update head to last processed node after reversal [OK]
Common Mistakes:
  • Forgetting to update head after reversal
  • Returning old head instead of new head
  • Incorrect loop condition causing infinite loop
5. Given a doubly linked list with nodes containing integer data, how would you modify the reversal function to also count how many nodes were reversed and return both the new head and the count?
hard
A. Modify the function to use an object return type like { head: Node | null, count: number }, increment count inside the loop, and update head after reversal.
B. Add a global variable to count nodes and return only the new head.
C. Count nodes before reversal and return the count without changing the function.
D. Return an array with the reversed list nodes and count without modifying the reversal logic.

Solution

  1. Step 1: Add a counter variable inside the reversal function

    Initialize a count variable to zero and increment it each time a node is processed in the reversal loop.
  2. Step 2: Return both new head and count

    After reversal, return an object containing the updated head and the count of nodes reversed.
  3. Final Answer:

    Modify the function to use an object return type like { head: Node | null, count: number }, increment count inside the loop, and update head after reversal. -> Option A
  4. Quick Check:

    Return head and count together after reversal [OK]
Hint: Use an object return type to return multiple values [OK]
Common Mistakes:
  • Using global variables instead of local counters
  • Not updating head before returning
  • Returning count without reversing
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard