C Programs | IT Developer
IT Developer

C Programs



Share with a Friend

Data Structures in C

Reversal of Doubly Linked List

C Program: Reversal of Doubly Linked List

C

#include <stdio.h>

#include <stdlib.h>

 

// Structure definition

struct Node {

    int data;

    struct Node *prev;

    struct Node *next;

};

 

// Function to create a new node

struct Node* createNode(int data) {

    struct Node *newNode = (struct Node*)malloc(sizeof(struct Node));

    newNode->data = data;

    newNode->prev = NULL;

    newNode->next = NULL;

    return newNode;

}

 

// Function to insert at end

struct Node* insertAtEnd(struct Node *head, int data) {

    struct Node *newNode = createNode(data);

    if (head == NULL)

        return newNode;

 

    struct Node *temp = head;

    while (temp->next != NULL)

        temp = temp->next;

 

    temp->next = newNode;

    newNode->prev = temp;

    return head;

}

 

// Function to display list

void displayList(struct Node *head) {

    struct Node *temp = head;

    printf("\nDoubly Linked List: ");

    while (temp != NULL) {

        printf("%d <-> ", temp->data);

        temp = temp->next;

    }

    printf("NULL\n");

}

 

// Function to reverse the doubly linked list

struct Node* reverseList(struct Node *head) {

    struct Node *temp = NULL;

    struct Node *current = head;

 

    if (head == NULL) {

        printf("\nList is empty.\n");

        return NULL;

    }

 

    // Swap next and prev for all nodes

    while (current != NULL) {

        temp = current->prev;

        current->prev = current->next;

        current->next = temp;

        current = current->prev; // move to the next node (previous before swap)

    }

 

    // Adjust head pointer

    if (temp != NULL)

        head = temp->prev;

 

    printf("\nList has been reversed.\n");

    return head;

}

 

int main() {

    struct Node *head = NULL;

    int n, data, i;

 

    printf("Enter number of nodes: ");

    scanf("%d", &n);

 

    for (i = 1; i <= n; i++) {

        printf("Enter data for node %d: ", i);

        scanf("%d", &data);

        head = insertAtEnd(head, data);

    }

 

    displayList(head);

 

    head = reverseList(head);

 

    displayList(head);

 

    return 0;

}

Output

 
OUTPUT :

Enter number of nodes: 4
Enter data for node 1: 10
Enter data for node 2: 20
Enter data for node 3: 30
Enter data for node 4: 40

Doubly Linked List: 10 <-> 20 <-> 30 <-> 40 <-> NULL

List has been reversed.

Doubly Linked List: 40 <-> 30 <-> 20 <-> 10 <-> NULL

Explanation

Step

Description

Step 1

Traverse through each node of the doubly linked list.

Step 2

For each node, swap the next and prev pointers.

Step 3

After traversal, update the head pointer to the last processed node.

Step 4

Display the reversed list.