Bird
Raised Fist0
DSA C++programming~5 mins

Reverse a Doubly Linked List in DSA C++ - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a doubly linked list?
A doubly linked list is a chain of nodes where each node has three parts: data, a pointer to the next node, and a pointer to the previous node. This allows moving forward and backward through the list.
Click to reveal answer
beginner
What does reversing a doubly linked list mean?
Reversing a doubly linked list means changing the direction of the list so that the first node becomes the last, and the last node becomes the first, by swapping the next and previous pointers of each node.
Click to reveal answer
intermediate
In reversing a doubly linked list, what happens to the 'next' and 'prev' pointers of each node?
For each node, the 'next' pointer is swapped with the 'prev' pointer. This flips the direction of the links between nodes.
Click to reveal answer
intermediate
Why do we need to update the head pointer after reversing a doubly linked list?
Because after reversing, the original tail becomes the new head. We must update the head pointer to point to this new first node to correctly represent the reversed list.
Click to reveal answer
beginner
What is the time complexity of reversing a doubly linked list?
The time complexity is O(n), where n is the number of nodes. We visit each node once to swap its pointers.
Click to reveal answer
What pointers do you swap in each node to reverse a doubly linked list?
AOnly Prev pointers
BData and Next pointers
COnly Next pointers
DNext and Prev pointers
After reversing a doubly linked list, what should the head pointer point to?
AOriginal tail node
BNull
CMiddle node
DOriginal head node
What is the time complexity to reverse a doubly linked list with n nodes?
AO(1)
BO(n)
CO(n^2)
DO(log n)
Which of these is NOT a part of a doubly linked list node?
ARandom pointer
BNext pointer
CData
DPrevious pointer
What happens if you forget to update the head pointer after reversing the list?
AThe list will be empty
BThe list will be corrupted
CThe list will still be reversed but head points to old first node
DThe list will be sorted
Explain step-by-step how to reverse a doubly linked list.
Think about swapping pointers and updating the head.
You got /4 concepts.
    Why is reversing a doubly linked list easier than reversing a singly linked list?
    Consider the extra pointer in doubly linked lists.
    You got /4 concepts.

      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