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 two links: one to the next node and one 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 links so that the first node becomes the last, and the last node becomes the first, effectively flipping the list order.
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 means the node's previous node becomes its next node and vice versa.
Click to reveal answer
intermediate
Why do we need to update the head pointer after reversing a doubly linked list?
Because the original head becomes the tail after reversing, we must update the head pointer to the last node processed to correctly represent the new start of the 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, because each node is visited once to swap its pointers.
Click to reveal answer
What pointers do you swap in each node when reversing a doubly linked list?
A'next' and 'prev'
B'head' and 'tail'
C'next' and 'head'
D'prev' and 'tail'
After reversing a doubly linked list, what should the head pointer point to?
AThe original head node
BThe middle node
CNull
DThe original tail node
What is the time complexity of reversing a doubly linked list with n nodes?
AO(n)
BO(1)
CO(n^2)
DO(log n)
Which of these is NOT true about a doubly linked list?
AEach node has a pointer to the next node
BEach node has a pointer to the previous node
CNodes can only be traversed forward
DThe list can be reversed by swapping pointers
What happens if you forget to update the head pointer after reversing a doubly linked list?
AThe list remains reversed correctly
BThe list traversal starts from the old head, causing incorrect order
CThe list will crash
DThe list appears empty
Explain step-by-step how to reverse a doubly linked list.
Think about what happens to each node's pointers and the head.
You got /4 concepts.
    Describe why reversing a doubly linked list is easier than reversing a singly linked list.
    Focus on 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 change the order of nodes so the last becomes first and vice versa
      B. To delete all nodes from the list
      C. To add new nodes at the end of the list
      D. To sort the nodes in ascending order

      Solution

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

        A doubly linked list has nodes connected forward and backward using next and prev pointers.
      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 change the order of nodes so the last becomes first and vice versa -> Option A
      4. Quick Check:

        Reversing = changing node order [OK]
      Hint: Reversing flips the list order front to back [OK]
      Common Mistakes:
      • Confusing reversing with deleting nodes
      • Thinking reversing sorts the list
      • Mixing up adding nodes with reversing
      2. Which of the following C# code snippets correctly swaps the next and prev pointers of a node in a doubly linked list?
      easy
      A. node.next = node.prev; node.prev = node.next;
      B. node.prev = node.next; node.next = node.prev;
      C. var temp = node.prev; node.next = node.prev; node.prev = temp;
      D. var temp = node.next; node.next = node.prev; node.prev = temp;

      Solution

      1. Step 1: Understand swapping pointers

        To swap two pointers, use a temporary variable to hold one value before overwriting it.
      2. Step 2: Check each option

        The correct snippet saves node.next in temp, assigns node.next = node.prev, then node.prev = temp. Direct assignments without temp cause data loss. The flawed temp usage assigns node.next = node.prev without saving the original node.next first, losing data.
      3. Final Answer:

        var temp = node.next; node.next = node.prev; node.prev = temp; -> Option D
      4. Quick Check:

        Use temp variable to swap pointers [OK]
      Hint: Always use a temp variable to swap two pointers [OK]
      Common Mistakes:
      • Swapping without a temporary variable
      • Assigning pointers in wrong order
      • Confusing next and prev roles
      3. What will be the output of the following C# code after reversing the doubly linked list?
      class Node {
        public int data;
        public Node next, prev;
        public Node(int d) { data = d; next = prev = null; }
      }
      
      // List: 1 <-> 2 <-> 3
      Node head = new Node(1);
      Node second = new Node(2);
      Node third = new Node(3);
      head.next = second; second.prev = head;
      second.next = third; third.prev = second;
      
      // Reverse function
      Node Reverse(Node head) {
        Node current = head;
        Node 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;
      }
      
      head = Reverse(head);
      
      // Print list forward
      Node tempNode = head;
      string result = "";
      while (tempNode != null) {
        result += tempNode.data + " -> ";
        tempNode = tempNode.next;
      }
      result += "null";
      Console.WriteLine(result);
      medium
      A. 3 -> 2 -> 1 -> null
      B. 1 -> 2 -> 3 -> null
      C. null
      D. 1 -> 3 -> 2 -> null

      Solution

      1. Step 1: Trace the reversal loop

        Each node swaps its next and prev pointers. The loop moves current to current.prev (which was originally next). After the loop, head is updated to the last processed node.
      2. Step 2: Verify the new order

        Original list: 1 <-> 2 <-> 3. After reversal, the list becomes 3 <-> 2 <-> 1. Printing forward from new head prints 3 -> 2 -> 1 -> null.
      3. Final Answer:

        3 -> 2 -> 1 -> null -> Option A
      4. Quick Check:

        Reversed list prints backward order [OK]
      Hint: Reversing flips list order; last node becomes head [OK]
      Common Mistakes:
      • Not updating head after reversal
      • Confusing next and prev pointers
      • Printing list without updating head
      4. Identify the bug in this reverse function for a doubly linked list:
      Node Reverse(Node head) {
        Node current = head;
        Node temp = null;
        while (current != null) {
          temp = current.next;
          current.next = current.prev;
          current.prev = temp;
          current = current.next;
        }
        if (temp != null) head = temp.prev;
        return head;
      }
      medium
      A. The variable temp should store current.next, not current.prev
      B. The loop should move current to current.prev, not current.next
      C. The head update line should be head = temp.next
      D. There is no bug; the code is correct

      Solution

      1. Step 1: Analyze pointer swapping

        The code swaps next and prev pointers correctly, but moves current to current.next, which after swapping points backward.
      2. Step 2: Correct traversal direction

        After swapping, current should move to current.prev (originally next) to continue forward traversal. Moving to current.next causes skipping or infinite loop.
      3. Final Answer:

        The loop should move current to current.prev, not current.next -> Option B
      4. Quick Check:

        Traverse using swapped pointers correctly [OK]
      Hint: After swapping, move current to current.prev pointer [OK]
      Common Mistakes:
      • Moving current in wrong direction after swap
      • Incorrect temp assignment
      • Wrong head update after reversal
      5. Given a doubly linked list with nodes containing integer values, how would you modify the reversal function to also count how many nodes were reversed during the process?
      hard
      A. Add a counter but increment it only after the loop finishes.
      B. Count nodes before reversal and return the count without changes.
      C. Add a counter variable initialized to 0, increment it inside the reversal loop, and return it along with the new head.
      D. Use recursion to reverse and count nodes simultaneously.

      Solution

      1. Step 1: Initialize a counter before the loop

        Start a counter at zero to track how many nodes are processed during reversal.
      2. Step 2: Increment counter inside the reversal loop

        Each time a node is processed (pointers swapped), increase the counter by one.
      3. Step 3: Return both new head and count

        Modify the function to return the new head and the count of reversed nodes.
      4. Final Answer:

        Add a counter variable initialized to 0, increment it inside the reversal loop, and return it along with the new head. -> Option C
      5. Quick Check:

        Count nodes during reversal loop [OK]
      Hint: Count nodes inside reversal loop for accurate total [OK]
      Common Mistakes:
      • Counting nodes before reversal only
      • Incrementing counter after loop ends
      • Not returning the count with the head
      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