#include <iostream>
#include <vector>
using namespace std;
// Doubly Linked List Node structure
struct DLLNode {
int data;
DLLNode* next;
DLLNode* prev;
DLLNode(int x) : data(x), next(nullptr), prev(nullptr) {}
};
class Solution {
public:
// Function to reverse a doubly linked list
DLLNode* reverseDLL(DLLNode* head) {
if (head == nullptr || head->next == nullptr)
return head;
DLLNode *prev = nullptr, *current = head;
while (current != nullptr) {
// Swap next and prev pointers
prev = current->prev;
current->prev = current->next;
current->next = prev;
// Move to the next node (which is now in prev)
current = current->prev;
}
// Prev will be at the last node before reversal
// So prev->prev will be the new head
return prev->prev;
}
};
// Helper function to create DLL from vector
DLLNode* createDLL(vector<int>& arr) {
if (arr.empty()) return nullptr;
DLLNode* head = new DLLNode(arr[0]);
DLLNode* current = head;
for (int i = 1; i < arr.size(); i++) {
current->next = new DLLNode(arr[i]);
current->next->prev = current;
current = current->next;
}
return head;
}
// Helper function to print DLL forward
void printForward(DLLNode* head) {
DLLNode* current = head;
while (current != nullptr) {
cout << current->data;
if (current->next != nullptr)
cout << " <-> ";
current = current->next;
}
cout << endl;
}
// Helper function to print DLL backward
void printBackward(DLLNode* tail) {
DLLNode* current = tail;
while (current != nullptr) {
cout << current->data;
if (current->prev != nullptr)
cout << " <-> ";
current = current->prev;
}
cout << endl;
}
// Helper function to delete DLL
void deleteDLL(DLLNode* head) {
while (head != nullptr) {
DLLNode* temp = head;
head = head->next;
delete temp;
}
}
int main() {
Solution sol;
// Test Case 1: Normal case
vector<int> arr1 = {1, 2, 3, 4, 5};
DLLNode* dll1 = createDLL(arr1);
cout << "Original DLL: ";
printForward(dll1);
DLLNode* reversed1 = sol.reverseDLL(dll1);
cout << "Reversed DLL: ";
printForward(reversed1);
cout << "Backward traversal: ";
printBackward(reversed1);
deleteDLL(reversed1);
// Test Case 2: Single node
vector<int> arr2 = {10};
DLLNode* dll2 = createDLL(arr2);
cout << "\nOriginal DLL (single node): ";
printForward(dll2);
DLLNode* reversed2 = sol.reverseDLL(dll2);
cout << "Reversed DLL: ";
printForward(reversed2);
deleteDLL(reversed2);
// Test Case 3: Empty list
vector<int> arr3 = {};
DLLNode* dll3 = createDLL(arr3);
cout << "\nEmpty DLL: ";
printForward(dll3);
DLLNode* reversed3 = sol.reverseDLL(dll3);
cout << "Reversed DLL: ";
printForward(reversed3);
deleteDLL(reversed3);
return 0;
}