Print a Linked List in Reverse Order using Recursion

  • Write a C program to read a linked list in reverse direction using recursion.

To print a singly linked list in reverse order, we will use a recursive function.
We will store the head node of linked list in function stack and then recursively call reverseLLPrint function for sub linked list starting from head->next. When sub linked list get printed in reverse order then we will print the head node stored in function stack.

Input Linked List
1 --> 8 --> 3 --> 20 --> 5 --> NULL
Nodes in reverse order
5 20 3 8 1
Singly linked list's node structure is as follows:
struct node {
    int data;
    struct node *next;
}
Function void reverseLLPrint(struct node *head) is a recursive function which takes head pointer of a linked list prints it's nodes in reverse order.
void reverseLLPrint(struct node *head) {
    if (head != NULL) {
        reverseLLPrint(head->next);
        printf("%d ", head->data);
    }
}


C program to print a linked list in reverse using recursion

#include <stdio.h>
#include <stdlib.h>
 
/* A structure of linked list node */
struct node {
  int data;
  struct node *next;
} *head;

void initialize(){
    head = NULL;
}

/* 
Given a Inserts a node in front of a singly linked list. 
*/
void insert(int num) {
    /* Create a new Linked List node */
    struct node* newNode = (struct node*) malloc(sizeof(struct node));
    newNode->data  = num;
    /* Next pointer of new node will point to head node of linked list  */
    newNode->next = head;
    /* make new node as new head of linked list */
    head = newNode;
    printf("Inserted Element : %d\n", num);
}

/*
Prints Linked List in reverse order without reversing it. 
*/
void reverseLLPrint(struct node *head) {
    if (head != NULL) {
        reverseLLPrint(head->next);
        printf("%d ", head->data);
    }
}

/*
Prints a linked list from head node till tail node 
*/
void printLinkedList(struct node *nodePtr) {
  while (nodePtr != NULL) {
     printf("%d", nodePtr->data);
     nodePtr = nodePtr->next;
     if(nodePtr != NULL)
         printf("-->");
     else
         printf("-->NULL");
  }
}
 
int main() {
    initialize();
    /* Creating a linked List*/
    insert(8);  
    insert(3); 
    insert(2); 
    insert(7);
    insert(9);
    
    printf("\nLinked List\n");
    printLinkedList(head);

    printf("\nPrinting Linked List in Reversed Order\n");
    reverseLLPrint(head);
    
    return 0;
}
Output
Inserted Element : 8
Inserted Element : 3
Inserted Element : 2
Inserted Element : 7
Inserted Element : 9

Linked List
9-->7-->2-->3-->8-->NULL
Printing Linked List in Reversed Order
8 3 2 7 9