Skip to main content

Reverse a doubly linked list

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.

 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