Bird
Raised Fist0
DSA C++programming~10 mins

Reverse a Doubly Linked List in DSA C++ - Execution Trace

Choose your learning style10 modes available
Concept Flow - Reverse a Doubly Linked List
Start at head node
↓
Swap prev and next pointers
↓
Move to new prev (old next) node
↓
Repeat until current node is null
↓
Update head to last processed node
↓
Done: list reversed
Start from the head, swap each node's prev and next pointers, move forward using the old next pointer, and finally update the head to the last node processed.
Execution Sample
DSA C++
Node* reverse(Node* head) {
  Node* current = head;
  Node* temp = nullptr;
  while (current != nullptr) {
    temp = current->prev;
    current->prev = current->next;
    current->next = temp;
    current = current->prev;
  }
  if (temp != nullptr) head = temp->prev;
  return head;
}
This code reverses a doubly linked list by swapping prev and next pointers of each node and updating the head pointer.
Execution Table
StepOperationCurrent Nodeprev Pointernext PointerPointer SwapMove toList Visual State
1Start at headNode 1nullNode 2Swap prev and nextMove to Node 2 (old next)1 <-> 2 <-> 3 <-> null
2Swap pointersNode 2Node 1Node 3Swap prev and nextMove to Node 3 (old next)1 <- 2 <-> 3 <-> null
3Swap pointersNode 3Node 2nullSwap prev and nextMove to null (end)1 <- 2 <- 3
4Update headNode 3Node 2nullHead = Node 3Stop3 <-> 2 <-> 1 <-> null
💡 Current node becomes null, traversal ends, head updated to last processed node.
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4 (final)
currentNode 1Node 2Node 3nullnull
tempnullnullNode 1Node 2Node 2
headNode 1Node 1Node 1Node 1Node 3
Key Moments - 3 Insights
Why do we swap prev and next pointers for each node?
Swapping prev and next reverses the direction of links. See execution_table steps 1-3 where prev and next pointers are swapped to reverse the list.
Why do we move current to current->prev after swapping?
After swapping, current->prev points to the original next node, so moving to current->prev moves forward in the original list. Refer to execution_table 'Move to' column steps 1-3.
How do we update the head pointer after reversal?
The head is updated to temp->prev after the loop ends, which is the last node processed (new head). See execution_table step 4 where head changes to Node 3.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 2, what is the 'current' node's next pointer after swapping?
ANode 3
BNode 1
Cnull
DNode 2
💡 Hint
Check the 'next Pointer' column at step 2 in execution_table.
At which step does the current node become null, ending the loop?
AStep 3
BStep 2
CStep 1
DStep 4
💡 Hint
Look at the 'Move to' column where current moves to null.
If we forget to update the head pointer after reversal, what will be the list's head?
Anull
BNode 3 (new head)
CNode 1 (original head)
DNode 2
💡 Hint
Refer to variable_tracker 'head' values before and after step 4.
Concept Snapshot
Reverse a Doubly Linked List:
- Traverse from head
- Swap each node's prev and next pointers
- Move current to old next (current->prev after swap)
- Update head to last processed node
- Result: list direction reversed
Full Transcript
To reverse a doubly linked list, start at the head node. For each node, swap its prev and next pointers. Then move to the node that was originally next by moving current to current->prev after swapping. Continue until current becomes null, meaning the end of the list. Finally, update the head pointer to the last node processed, which is the new head of the reversed list. This process reverses the direction of the list by flipping the links between nodes.

Practice

(1/5)
1. What is the main purpose of reversing a doubly linked list?
easy
A. To make the last node the first and the first node the last
B. To delete all nodes from the list
C. To sort the list in ascending order
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: Define reversing operation

    Reversing means swapping the direction so the last node becomes the first and vice versa.
  3. Final Answer:

    To make the last node the first and the first node the last -> Option A
  4. Quick Check:

    Reverse = swap start and end [OK]
Hint: Reversing swaps head and tail pointers [OK]
Common Mistakes:
  • Confusing reversing with deleting nodes
  • Thinking reversing sorts the list
  • Assuming it changes list type
2. Which of the following is the correct way to swap the next and prev pointers of a node curr in C++?
easy
A. curr->next = curr->prev; curr->prev = curr->next;
B. std::swap(curr->next, curr->prev);
C. curr->prev = curr->next; curr->next = curr->prev;
D. curr->next = curr->next; curr->prev = curr->prev;

Solution

  1. Step 1: Understand pointer swapping

    Swapping two pointers requires a temporary storage or a swap function to avoid overwriting.
  2. Step 2: Use std::swap for safe swapping

    std::swap exchanges values safely without losing data.
  3. Final Answer:

    std::swap(curr->next, curr->prev); -> Option B
  4. Quick Check:

    Use std::swap to exchange pointers [OK]
Hint: Use std::swap to exchange two pointers safely [OK]
Common Mistakes:
  • Assigning one pointer to another without temp causes data loss
  • Swapping pointers manually without temp variable
  • Confusing assignment with swapping
3. What will be the output of the following code snippet after reversing the doubly linked list?
struct Node {
  int data;
  Node* next;
  Node* prev;
};

// List: 1 <-> 2 <-> 3
Node* head = new Node{1, nullptr, nullptr};
Node* second = new Node{2, nullptr, head};
head->next = second;
Node* third = new Node{3, nullptr, second};
second->next = third;

// Reverse function
Node* reverse(Node* head) {
  Node* curr = head;
  Node* temp = nullptr;
  while (curr != nullptr) {
    temp = curr->prev;
    curr->prev = curr->next;
    curr->next = temp;
    curr = curr->prev;
  }
  if (temp != nullptr) head = temp->prev;
  return head;
}

head = reverse(head);

// Print list
Node* tempPrint = head;
while (tempPrint != nullptr) {
  std::cout << tempPrint->data << " ";
  tempPrint = tempPrint->next;
}
medium
A. 2 3 1
B. 1 2 3
C. 3 2 1
D. 3 1 2

Solution

  1. Step 1: Trace pointer swaps in reverse function

    Each node swaps its next and prev pointers, then moves to original next (now prev).
  2. Step 2: Update head to new first node

    After loop, head is updated to last processed node's prev, which is the original tail.
  3. Final Answer:

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

    Reversed list prints from tail to head [OK]
Hint: After reversing, head points to original tail [OK]
Common Mistakes:
  • Not updating head after reversal
  • Confusing next and prev pointers
  • Printing from old head instead of new
4. Identify the error in the following reverse function for a doubly linked list and select the fix.
Node* reverse(Node* head) {
  Node* curr = head;
  Node* temp = nullptr;
  while (curr != nullptr) {
    temp = curr->prev;
    curr->prev = curr->next;
    curr->next = temp;
    curr = curr->next;  // Error here
  }
  if (temp != nullptr) head = temp->prev;
  return head;
}
medium
A. Change 'head = temp->prev;' to 'head = temp->next;'
B. Remove the line 'temp = curr->prev;'
C. Add 'curr = curr->prev;' before the loop
D. Change 'curr = curr->next;' to 'curr = curr->prev;'

Solution

  1. Step 1: Analyze pointer movement in loop

    After swapping next and prev, moving curr to curr->next is wrong because next and prev are swapped.
  2. Step 2: Correct pointer update

    We must move curr to curr->prev (original next) after swapping.
  3. Final Answer:

    Change 'curr = curr->next;' to 'curr = curr->prev;' -> Option D
  4. Quick Check:

    Move curr along swapped pointers [OK]
Hint: After swapping, move curr to prev pointer [OK]
Common Mistakes:
  • Moving curr to next instead of prev after swap
  • Not updating head correctly
  • Ignoring pointer swap effects
5. Given a doubly linked list with nodes containing integers, how would you modify the reverse function to also count how many nodes were reversed and return that count along with the new head?
hard
A. Modify the function to return a pair, increment count inside the loop, and return both.
B. Add a global variable to count nodes and return only the head.
C. Count nodes before reversal and return the count without changing the function.
D. Use recursion to reverse and count nodes simultaneously without changing return type.

Solution

  1. Step 1: Change function return type

    Use std::pair to return both new head and count.
  2. Step 2: Count nodes during reversal

    Initialize count=0; increment count inside the reversal loop for each node processed.
  3. Step 3: Return both values

    Return std::make_pair(new_head, count) after reversal completes.
  4. Final Answer:

    Modify the function to return a pair, increment count inside the loop, and return both. -> Option A
  5. Quick Check:

    Return both head and count using pair [OK]
Hint: Return pair with head and count, increment count in loop [OK]
Common Mistakes:
  • Using global variables instead of return values
  • Counting nodes before reversal only
  • Trying recursion without changing return type
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