#include <stdio.h>
#include <stdlib.h>
// Node structure for doubly linked list
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;
// Create a new node
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
// Append node at end
void append(Node** head_ref, int data) {
Node* newNode = createNode(data);
if (*head_ref == NULL) {
*head_ref = newNode;
return;
}
Node* temp = *head_ref;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
newNode->prev = temp;
}
// Reverse the doubly linked list
void reverse(Node** head_ref) {
Node* curr = *head_ref;
Node* temp = NULL;
while (curr != NULL) {
// Swap prev and next pointers
temp = curr->prev;
curr->prev = curr->next;
curr->next = temp;
// Move curr to next node in original list (which is prev now)
curr = curr->prev;
}
// After loop, temp points to previous node, update head
if (temp != NULL) {
*head_ref = temp->prev;
}
}
// Print list from head to tail
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d", temp->data);
if (temp->next != NULL) {
printf(" ↔ ");
}
temp = temp->next;
}
printf(" -> null\n");
}
int main() {
Node* head = NULL;
append(&head, 1);
append(&head, 2);
append(&head, 3);
printf("Original list:\n");
printList(head);
reverse(&head);
printf("Reversed list:\n");
printList(head);
return 0;
}
Traverse each node to reverse pointers
Store original prev pointer before swap
Swap prev and next pointers to reverse link
Complete pointer swap for current node
Move to next node in original order (prev after swap)
if (temp != NULL) { *head_ref = temp->prev; }
Update head to new first node after reversal
Original list:
1 ↔ 2 ↔ 3 -> null
Reversed list:
3 ↔ 2 ↔ 1 -> null