Required knowledge
Basic C programming, Dynamic memory allocation, Doubly linked listAlgorithm to reverse a doubly linked list
Algorithm to reverse a doubly linked list %% Input : head {Pointer to first node of the list} last {Pointer to last node of the list} Begin: current ← head; While (current != NULL) do temp ← current.next; current.next ← current.prev; current.prev ← temp; current ← temp; End while temp ← head; head ← last; last ← temp; End
Steps to reverse a doubly linked list
There can be various ways to reverse a doubly linked list. Here I am using the simplest approach to reverse the list.-
To reverse the list we start with the first node. Say a pointer current keeps track of the current node. Now initially current points to head node.
-
Swap the previous and next pointer fields of current node.
-
Move the position of current pointer to its next node. In general, now current.prev holds the address of next node.
-
Repeat Step 2-3 until current pointer becomes NULL.
-
When, the current pointer becomes NULL then the list will look something like.
-
Finally, swap the head and last pointers and you are done.
-
Now, if you compare the above image to the below given image you will find both are similar linked list.
Program
/** * C program to reverse a Doubly linked list */ #include <stdio.h> #include <stdlib.h> /* * Basic structure of Node */ struct node { int data; struct node * prev; struct node * next; }*head, *last; /* * Functions used in this program */ void createList(int n); void displayList(); void reverseList(); int main() { int n, data, choice=1; head = NULL; last = NULL; /* * Runs forever until user chooses 0 */ while(choice != 0) { printf("============================================\n"); printf("DOUBLY LINKED LIST PROGRAM\n"); printf("============================================\n"); printf("1. Create List\n"); printf("2. Reverse List\n"); printf("3. Display list\n"); printf("0. Exit\n"); printf("--------------------------------------------\n"); printf("Enter your choice : "); scanf("%d", &choice); switch(choice) { case 1: printf("Enter the total number of nodes in list: "); scanf("%d", &n); createList(n); break; case 2: reverseList(); break; case 3: displayList(); break; case 0: break; default: printf("Error! Invalid choice. Please choose between 0-3"); } printf("\n\n\n\n\n"); } return 0; } /** * Creates a doubly linked list of n nodes. * * @n Number of nodes to be created */ void createList(int n) { int i, data; struct node *newNode; if(n >= 1) { /* * Creates and links the head node */ head = (struct node *)malloc(sizeof(struct node)); printf("Enter data of 1 node: "); scanf("%d", &data); head->data = data; head->prev = NULL; head->next = NULL; last = head; /* * Creates and links rest of the n-1 nodes */ for(i=2; i<=n; i++) { newNode = (struct node *)malloc(sizeof(struct node)); printf("Enter data of %d node: ", i); scanf("%d", &data); newNode->data = data; newNode->prev = last; //Links new node with the previous node newNode->next = NULL; last->next = newNode; //Links previous node with the new node last = newNode; //Makes new node as last/previous node } printf("\nDOUBLY LINKED LIST CREATED SUCCESSFULLY\n"); } } /** * Displays the content of the list from beginning to end */ void displayList() { struct node * temp; int n = 1; if(head == NULL) { printf("List is empty.\n"); } else { temp = head; printf("DATA IN THE LIST:\n"); while(temp != NULL) { printf("DATA of %d node = %d\n", n, temp->data); n++; /* Moves the current pointer to next node */ temp = temp->next; } } } /** * Reverses the order of the doubly linked list */ void reverseList() { struct node *current, *temp; current = head; while(current != NULL) { /* * Swap the previous and next address fields of current node */ temp = current->next; current->next = current->prev; current->prev = temp; /* Move the current pointer to next node which is stored in temp */ current = temp; } /* * Swap the head and last pointers */ temp = head; head = last; last = temp; printf("LIST REVERSED SUCCESSFULLY.\n"); }
Output
============================================
DOUBLY LINKED LIST PROGRAM
============================================
1. Create List
2. Reverse List
3. Display list
0. Exit
--------------------------------------------
Enter your choice : 1
Enter the total number of nodes in list: 4
Enter data of 1 node: 10
Enter data of 2 node: 20
Enter data of 3 node: 30
Enter data of 4 node: 40
DOUBLY LINKED LIST CREATED SUCCESSFULLY
============================================
DOUBLY LINKED LIST PROGRAM
============================================
1. Create List
2. Reverse List
3. Display list
0. Exit
--------------------------------------------
Enter your choice : 3
DATA IN THE LIST:
DATA of 1 node = 10
DATA of 2 node = 20
DATA of 3 node = 30
DATA of 4 node = 40
============================================
DOUBLY LINKED LIST PROGRAM
============================================
1. Create List
2. Reverse List
3. Display list
0. Exit
--------------------------------------------
Enter your choice : 2
LIST REVERSED SUCCESSFULLY.
============================================
DOUBLY LINKED LIST PROGRAM
============================================
1. Create List
2. Reverse List
3. Display list
0. Exit
--------------------------------------------
Enter your choice : 3
DATA IN THE LIST:
DATA of 1 node = 40
DATA of 2 node = 30
DATA of 3 node = 20
DATA of 4 node = 10
============================================
DOUBLY LINKED LIST PROGRAM
============================================
1. Create List
2. Reverse List
3. Display list
0. Exit
--------------------------------------------
Enter your choice : 0
DOUBLY LINKED LIST PROGRAM
============================================
1. Create List
2. Reverse List
3. Display list
0. Exit
--------------------------------------------
Enter your choice : 1
Enter the total number of nodes in list: 4
Enter data of 1 node: 10
Enter data of 2 node: 20
Enter data of 3 node: 30
Enter data of 4 node: 40
DOUBLY LINKED LIST CREATED SUCCESSFULLY
============================================
DOUBLY LINKED LIST PROGRAM
============================================
1. Create List
2. Reverse List
3. Display list
0. Exit
--------------------------------------------
Enter your choice : 3
DATA IN THE LIST:
DATA of 1 node = 10
DATA of 2 node = 20
DATA of 3 node = 30
DATA of 4 node = 40
============================================
DOUBLY LINKED LIST PROGRAM
============================================
1. Create List
2. Reverse List
3. Display list
0. Exit
--------------------------------------------
Enter your choice : 2
LIST REVERSED SUCCESSFULLY.
============================================
DOUBLY LINKED LIST PROGRAM
============================================
1. Create List
2. Reverse List
3. Display list
0. Exit
--------------------------------------------
Enter your choice : 3
DATA IN THE LIST:
DATA of 1 node = 40
DATA of 2 node = 30
DATA of 3 node = 20
DATA of 4 node = 10
============================================
DOUBLY LINKED LIST PROGRAM
============================================
1. Create List
2. Reverse List
3. Display list
0. Exit
--------------------------------------------
Enter your choice : 0
Happy coding ;)