📖 Scenario: You are working on a music playlist app. The playlist is stored as a doubly linked list where each node contains a song name. Sometimes, users want to play the playlist in reverse order.
🎯 Goal: Build a program that creates a doubly linked list of songs, then reverses the list so the songs play in the opposite order.
📋 What You'll Learn
Create a doubly linked list with exactly these songs in order: "SongA", "SongB", "SongC", "SongD"
Create a variable to hold the head of the list
Write a method to reverse the doubly linked list by swapping the next and previous pointers
Print the reversed list from head to tail showing song names separated by " -> " and ending with "null"
💡 Why This Matters
🌍 Real World
Doubly linked lists are used in music players, browsers, and other apps where users navigate forward and backward through items.
💼 Career
Understanding how to manipulate doubly linked lists is important for software developers working on data structures, memory management, and performance optimization.
Progress0 / 4 steps
1
Create the doubly linked list with songs
Create a class called Node with public string Song, public NodeNext, and public NodePrev. Then create four nodes with songs "SongA", "SongB", "SongC", and "SongD". Link them to form a doubly linked list in that order. Finally, create a variable called head that points to the first node.
DSA C#
Hint
Remember to set both Next and Prev pointers for each node to link them properly.
2
Create a method to reverse the doubly linked list
Create a method called ReverseList that takes a Node parameter called head and returns a Node. Inside, use a while loop to traverse the list. For each node, swap its Next and Prev pointers. After the loop, return the new head of the reversed list.
DSA C#
Hint
Swapping Next and Prev pointers reverses the direction of the list.
3
Call the reverse method and update the head
Call the ReverseList method with the variable head and assign the result back to head.
DSA C#
Hint
Assign the reversed list's head back to head to update the list start.
4
Print the reversed doubly linked list
Use a Node variable called current to traverse the list starting from head. Use a while loop to print each node's Song followed by " -> ". After the loop, print "null" to show the end of the list.
DSA C#
Hint
Print each song followed by " -> ", then print "null" after the loop.
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
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.
Step 2: Purpose of reversing
Reversing swaps the direction so the last node becomes the first and the first becomes the last.
Final Answer:
To change the order of nodes so the last becomes first and vice versa -> Option A
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
Step 1: Understand swapping pointers
To swap two pointers, use a temporary variable to hold one value before overwriting it.
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.
Final Answer:
var temp = node.next; node.next = node.prev; node.prev = temp; -> Option D
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
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.
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.
Final Answer:
3 -> 2 -> 1 -> null -> Option A
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
Step 1: Analyze pointer swapping
The code swaps next and prev pointers correctly, but moves current to current.next, which after swapping points backward.
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.
Final Answer:
The loop should move current to current.prev, not current.next -> Option B
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
Step 1: Initialize a counter before the loop
Start a counter at zero to track how many nodes are processed during reversal.
Step 2: Increment counter inside the reversal loop
Each time a node is processed (pointers swapped), increase the counter by one.
Step 3: Return both new head and count
Modify the function to return the new head and the count of reversed nodes.
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
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 unknownstrongwhile earning +1 Grip toward your certificate.