C program to create copy of a singly Linked List using Recursion

20 Oct, 2020
Given a pointer to the head node of a Linked List, the task is to create a copy of the linked list using recursion.
Examples::
Input: Head of following linked list1->2->3->4->NULLOutput: Original list: 1 -> 2 -> 3 -> 4 -> NULLDuplicate list: 1 -> 2 -> 3 -> 4 -> NULL
Input: Head of following linked list1->2->3->4->5->NULLOutput: Original list: 1->2->3->4->5->NULL,Duplicate list: 1->2->3->4->5->NULL,
Approach: Follow the steps below to solve the problem:
Base case: if (head == NULL), then return NULL.Allocate the new Node in the Heap using malloc() & set its data.Recursively set the next pointer of the new Node by recurring for the remaining nodes.Return the head pointer of the duplicate node.Finally, print both the original linked list and the duplicate linked list.
Base case: if (head == NULL), then return NULL.
Allocate the new Node in the Heap using malloc() & set its data.
Recursively set the next pointer of the new Node by recurring for the remaining nodes.
Return the head pointer of the duplicate node.
Finally, print both the original linked list and the duplicate linked list.
Below is the implementation of the above approach:
C
// C program for the above approach#include <stdio.h>#include <stdlib.h>  // Node for linked liststruct Node {    int data;    struct Node* next;};  // Function to print given linked listvoid printList(struct Node* head){    struct Node* ptr = head;    while (ptr) {          printf("%d -> ", ptr->data);        ptr = ptr->next;    }      printf("NULL");}  // Function to create a new nodevoid insert(struct Node** head_ref, int data){    // Allocate the memory for new Node    // in the heap and set its data    struct Node* newNode        = (struct Node*)malloc(            sizeof(struct Node));      newNode->data = data;      // Set the next node pointer of the    // new Node to point to the current    // node of the list    newNode->next = *head_ref;      // Change the pointer of head to point    // to the new Node    *head_ref = newNode;}  // Function to create a copy of a linked liststruct Node* copyList(struct Node* head){    if (head == NULL) {        return NULL;    }    else {          // Allocate the memory for new Node        // in the heap and set its data        struct Node* newNode            = (struct Node*)malloc(                sizeof(struct Node));          newNode->data = head->data;          // Recursively set the next pointer of        // the new Node by recurring for the        // remaining nodes        newNode->next = copyList(head->next);          return newNode;    }}  // Function to create the new linked liststruct Node* create(int arr[], int N){    // Pointer to point the head node    // of the singly linked list    struct Node* head_ref = NULL;      // Construct the linked list    for (int i = N - 1; i >= 0; i--) {          insert(&head_ref, arr[i]);    }      // Return the head pointer    return head_ref;}  // Function to create both the listsvoid printLists(struct Node* head_ref,                struct Node* dup){      printf("Original list: ");      // Print the original linked list    printList(head_ref);      printf("\nDuplicate list: ");      // Print the duplicate linked list    printList(dup);}  // Driver Codeint main(void){    // Given nodes value    int arr[] = { 1, 2, 3, 4, 5 };    int N = sizeof(arr) / sizeof(arr[0]);      // Head of the original Linked list    struct Node* head_ref = create(arr, N);      // Head of the duplicate Linked List    struct Node* dup = copyList(head_ref);      printLists(head_ref, dup);      return 0;}
Original list: 1 -> 2 -> 3 -> 4 -> 5 -> NULL
Duplicate list: 1 -> 2 -> 3 -> 4 -> 5 -> NULL

Time Complexity: O(N)Auxiliary Space: O(N)
C-Pointers
C Programs
Linked List
Recursion
Linked List
Recursion
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
C Program to read contents of Whole File
Producer Consumer Problem in C
Difference between break and continue statement in C
C Hello World Program
C program to find the length of a string
Linked List | Set 1 (Introduction)
Linked List | Set 2 (Inserting a node)
Reverse a linked list
Stack Data Structure (Introduction and Program)
Linked List | Set 3 (Deleting a node)