From f9f30871c2c93cad993ebea33ca1e73c6a52cecc Mon Sep 17 00:00:00 2001 From: Mahi Yadav <95998757+Mahi5902@users.noreply.github.com> Date: Wed, 4 Oct 2023 20:24:07 +0530 Subject: [PATCH] Reverse_a_doubly_linked_list.cpp here is my code in c++ for reversing a doubly linked list with proper comments and also i have explained my approach with time complexity and space complexity. --- Reverse_a_doubly_linked_list.cpp | 114 +++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 Reverse_a_doubly_linked_list.cpp diff --git a/Reverse_a_doubly_linked_list.cpp b/Reverse_a_doubly_linked_list.cpp new file mode 100644 index 0000000..bf19c59 --- /dev/null +++ b/Reverse_a_doubly_linked_list.cpp @@ -0,0 +1,114 @@ +/* C++ program to reverse a doubly linked list */ +// approach +// Follow the given steps to solve the problem : + + // Traverse the linked list using a pointer + // Swap the prev and next pointers for all nodes + // At last, change the head pointer of the doubly linked list + +#include +using namespace std; + +/* Node of the doubly linked list */ +class Node { +public: + int data; + Node* next; + Node* prev; +}; + +/* Function to reverse a Doubly Linked List */ + +void reverse(Node** head_ref) +{ + Node* temp = NULL; + Node* current = *head_ref; + + /* swap next and prev for all nodes of + doubly linked list */ + + while (current != NULL) { + temp = current->prev; + current->prev = current->next; + current->next = temp; + current = current->prev; + } + + /* Before changing the head, check for the cases like + empty list and list with only one node */ + + if (temp != NULL) + *head_ref = temp->prev; +} + +/* UTILITY FUNCTIONS */ +/* Function to insert a node at the +beginning of the Doubly Linked List */ + +void push(Node** head_ref, int new_data) +{ + /* allocate node */ + + Node* new_node = new Node(); + + /* put in the data */ + new_node->data = new_data; + + /* since we are adding at the beginning, + prev is always NULL */ + + new_node->prev = NULL; + + /* link the old list of the new node */ + new_node->next = (*head_ref); + + /* change prev of head node to new node */ + if ((*head_ref) != NULL) + (*head_ref)->prev = new_node; + + /* move the head to point to the new node */ + (*head_ref) = new_node; +} + +/* Function to print nodes in a given doubly linked list +This function is same as printList() of singly linked list +*/ + +void printList(Node* node) +{ + while (node != NULL) { + cout << node->data << " "; + node = node->next; + } +} + +// main code +int main() +{ + /* Start with the empty list */ + Node* head = NULL; + + /* Let us create a sorted linked list to test the + functions Created linked list will be 10->8->4->2 */ + push(&head, 2); + push(&head, 4); + push(&head, 8); + push(&head, 10); + + cout << "Original Linked list" << endl; + printList(head); + + // Function call + reverse(&head); + + cout << "\nReversed Linked list" << endl; + printList(head); + + return 0; +} + +// output + // Original Linked list 10 8 4 2 + // Reversed Linked list 2 4 8 10 +// Time Complexity: O(N), where N denotes the number of nodes in the doubly linked list. +// Auxiliary Space: O(1)