A doubly linked list has two pointers in each node. Pointer to previous node and pointer to next node.
We have seen that reversing a singly linked list is not so easy. Because you do not have previous pointer. Since our DLL has previous pointers, its reversal must be easy.
I wrote a program earlier similar to SLL reversal- taking 3 nodes at a time and reversing links of two adjacent nodes. But I came across a better solution.
Just swap the previous link and next link for each node.
If there was only one node in the list, then t1 will be NULL and head=t1->prev will crash the program. So verify that t1 is not NULL.
The function with complete program is here.
We have seen that reversing a singly linked list is not so easy. Because you do not have previous pointer. Since our DLL has previous pointers, its reversal must be easy.
I wrote a program earlier similar to SLL reversal- taking 3 nodes at a time and reversing links of two adjacent nodes. But I came across a better solution.
Just swap the previous link and next link for each node.
NODEPTR reverse_list(NODEPTR head ) { NODEPTR temp=head; NODEPTR t1; while(temp) { //swap links t1 = temp->prev; temp->prev = temp->next; temp->next = t1; //move to next node temp = temp->prev; } if(t1!=NULL) head = t1->prev; return head; }
If there was only one node in the list, then t1 will be NULL and head=t1->prev will crash the program. So verify that t1 is not NULL.
The function with complete program is here.
#include<stdio.h> #include<stdlib.h> struct node { int n; struct node *next; struct node *prev; }; typedef struct node * NODEPTR; NODEPTR create_node(int value) { NODEPTR temp = (NODEPTR) malloc(sizeof(struct node)); temp->prev = temp->next = NULL; temp->n = value; return temp; } NODEPTR append_node(NODEPTR tail, NODEPTR newnode) { if(tail!=NULL) tail->next = newnode; newnode->prev = tail; tail = newnode; return tail; } void display_nodes(NODEPTR head) { NODEPTR temp = head; while (temp!= NULL) { printf("%d====>",temp->n); temp = temp->next; } } NODEPTR reverse_list(NODEPTR head ) { NODEPTR temp=head; NODEPTR t1; while(temp) { t1 = temp->prev; temp->prev = temp->next; temp->next = t1; temp = temp->prev; } if(t1!=NULL) head = t1->prev; return head; } int main() { NODEPTR head,tail; NODEPTR newnode; int numnodes,i; //initialize head and tail. Very important!! head = tail = NULL; printf("Number of nodes = "); scanf("%d",&numnodes); for(i = 0;i<numnodes;i++) { int value; NODEPTR newnode; printf("node value="); scanf("%d",&value); newnode = create_node(value); tail = append_node(tail,newnode); if(head==NULL) { head = tail; } } printf("The doubly linked list is "); display_nodes(head); head = reverse_list(head); printf("The doubly linked list in reverse is "); display_nodes(head); }
Comments
Post a Comment