Traverse Linked List from middle to left-right order using recursion - GeeksforGeeks

09 Jun, 2021
Given a Linked List. The task is to traverse the Linked List from middle to left-right order using recursion.For Example:  
If the given Linked List is: 2 -> 5 -> 8 -> 3 -> 7 -> 9 -> 12 -> NULL The Middle to left-right order is : 3, 8, 7, 5, 9, 2, 12  
Explanation: Middle of the given linked list is ‘3’ so, we start traversing from middle by printing 3 then left and right of 3, so we print 8, 7 then print left of 8 and right of 7, so we print 5, 9 then print left of 5 and right of 9, so we print 2, 12.Note: If number of node are even in a Linked List then print left right only. For this linked list( contains even number of nodes ) 2 -> 5 -> 8 -> 7 -> 9 -> 12 -> NULL.The output should be 8, 7, 5, 9, 2, 12.Examples:  
Input: 20 -> 15 -> 23 -> 13 -> 19 -> 32 -> 16 -> 41 -> 11 -> NULL Output: 19, 13, 32, 23, 16, 15, 41, 20, 11.Input: 12 -> 25 -> 51 -> 16 -> 9 -> 90 -> 7 -> 2 -> NULL Output: 16, 9, 51, 90, 25, 7, 12, 2.  
 
Approach: First, calculate the size of the linked list:  
If size is odd: -> Then go to the (n+1)/2 -th node using recursion.
If size is even: -> Then go to the n/2 -th node using recursion. 
Now print node data and return next node address, do this procedure unless function call stack empty.
Below is the implementation of the above approach:  
C++
Java
Python3
C#
Javascript
// A C++ program to demonstrate// the printing of Linked List middle// to left right order #include <bits/stdc++.h>using namespace std; // A linked list nodeclass Node {public:    int data;    Node* next;}; // Given a reference (pointer to pointer)// to the head of a list and an int, appends// a new node at the end void append(Node** head_ref, int new_data){    // Allocate node    Node* new_node = new Node();     // Used in step 5    Node* last = *head_ref;     // Put in the data    new_node->data = new_data;     // This new node is going to be    // the last node, so make next of    // it as NULL    new_node->next = NULL;     // If the Linked List is empty,    // then make the new node as head    if (*head_ref == NULL) {        *head_ref = new_node;        return;    }     // Else traverse till the last node    while (last->next != NULL)        last = last->next;     // Change the next of last node    last->next = new_node;    return;} // This function prints contents of// linked list starting from head void printList(Node* node){    while (node != NULL) {        cout << " " << node->data;         if (node->next != NULL)            cout << "->";        node = node->next;    }} // Function to get the size of linked listint getSize(Node* head){    if (head == NULL)        return 0;    return 1 + getSize(head->next);} // Utility function to print the Linked List// from middle to left right orderNode* printMiddleToLeftRightUtil(Node* head,                                 int counter, int lSize){    // Base Condition    // When size of list is odd    if (counter == 1 && lSize % 2 != 0) {         // Print node value        cout << head->data;         // Returns address of next node        return head->next;    }     // Base Condition    // When size of list is even    else if (counter == 1) {         // Print node value        // and next node value        cout << head->data;        cout << " , " << head->next->data;         // Returns address of next to next node        return head->next->next;    }    else {         // Recursive function call and        // store return address        Node* ptr = printMiddleToLeftRightUtil(            head->next,            counter - 1,            lSize);         // Print head data        cout << " , " << head->data;         // Print ptr data        cout << " , " << ptr->data;         // Returns address of next node        return ptr->next;    }} // Function to print Middle to// Left-right ordervoid printMiddleToLeftRight(Node* head){    // Function call to get the size    // Of Linked List    int listSize = getSize(head);     int middle = 0;     // Store middle when Linked    // List size is odd    if (listSize % 2 != 0) {        middle = (listSize + 1) / 2;    }     // Store middle when Linked    // List size is even     else {        middle = listSize / 2;    }     // Utility function call print    // Linked List from Middle    // to left right order    cout << "Output : ";     printMiddleToLeftRightUtil(head,                               middle,                               listSize);} // Driver codeint main(){    // Start with the empty list    Node* head = NULL;     // Insert 6. So linked list    // becomes 6->NULL    append(&head, 6);     // Insert 6. So linked list    // becomes 6->4->NULL    append(&head, 4);    append(&head, 8);    append(&head, 7);    append(&head, 9);    append(&head, 11);    append(&head, 2);     // After inserting linked list    // becomes 6->4->8->7->9->11->2->NULL    cout << "Created Linked list is: ";     // Function to display Linked List content    printList(head);    cout << endl;     // Function call print Linked List from    // Middle to left right order    printMiddleToLeftRight(head);    return 0;}
// A Java program to demonstrate// the printing of Linked List middle// to left right orderclass GFG{ // A linked list nodestatic class Node{    int data;    Node next;}; // Given a reference (pointer to pointer)// to the head of a list and an int, appends// a new node at the endstatic Node append(Node head_ref, int new_data){    // Allocate node    Node new_node = new Node();     // Used in step 5    Node last = head_ref;     // Put in the data    new_node.data = new_data;     // This new node is going to be    // the last node, so make next of    // it as null    new_node.next = null;     // If the Linked List is empty,    // then make the new node as head    if (head_ref == null)    {        head_ref = new_node;        return head_ref;    }     // Else traverse till the last node    while (last.next != null)        last = last.next;     // Change the next of last node    last.next = new_node;    return head_ref;} // This function prints contents of// linked list starting from headstatic void printList(Node node){    while (node != null)    {        System.out.print( " " + node.data);         if (node.next != null)            System.out.print("->");        node = node.next;    }} // Function to get the size of linked liststatic int getSize(Node head){    if (head == null)        return 0;    return 1 + getSize(head.next);} // Utility function to print the Linked List// from middle to left right orderstatic Node printMiddleToLeftRightUtil(Node head,                          int counter, int lSize){    // Base Condition    // When size of list is odd    if (counter == 1 && lSize % 2 != 0)    {         // Print node value        System.out.print( head.data);         // Returns address of next node        return head.next;    }     // Base Condition    // When size of list is even    else if (counter == 1)    {         // Print node value        // and next node value        System.out.print(head.data);        System.out.print( " , " + head.next.data);         // Returns address of next to next node        return head.next.next;    }    else    {         // Recursive function call and        // store return address        Node ptr = printMiddleToLeftRightUtil(head.next,                                    counter - 1, lSize);         // Print head data        System.out.print(" , " + head.data);         // Print ptr data        System.out.print(" , " + ptr.data);         // Returns address of next node        return ptr.next;    }} // Function to print Middle to// Left-right orderstatic void printMiddleToLeftRight(Node head){    // Function call to get the size    // Of Linked List    int listSize = getSize(head);     int middle = 0;     // Store middle when Linked    // List size is odd    if (listSize % 2 != 0)    {        middle = (listSize + 1) / 2;    }     // Store middle when Linked    // List size is even    else    {        middle = listSize / 2;    }     // Utility function call print    // Linked List from Middle    // to left right order    System.out.print("Output : ");     printMiddleToLeftRightUtil(head, middle, listSize);} // Driver codepublic static void main(String args[]){    // Start with the empty list    Node head = null;     // Insert 6. So linked list    // becomes 6.null    head = append(head, 6);     // Insert 6. So linked list    // becomes 6.4.null    head = append(head, 4);    head = append(head, 8);    head = append(head, 7);    head = append(head, 9);    head = append(head, 11);    head = append(head, 2);     // After inserting linked list    // becomes 6.4.8.7.9.11.2.null    System.out.print("Created Linked list is: ");     // Function to display Linked List content    printList(head);    System.out.println();     // Function call print Linked List from    // Middle to left right order    printMiddleToLeftRight(head);}} // This code is contributed by Arnab Kundu
# A Python3 program to demonstrate# the printing of Linked List middle# to left right order  # A linked list nodeclass Node:         def __init__(self):        self.data = 0        self.next = None  # Given a reference (pointer to pointer)# to the head of a list and an int, appends# a new node at the enddef append(head_ref, new_data):     # Allocate node    new_node = Node();      # Used in step 5    last = head_ref;      # Put in the data    new_node.data = new_data;      # This new node is going to be    # the last node, so make next of    # it as None    new_node.next = None;      # If the Linked List is empty,    # then make the new node as head    if (head_ref == None):        head_ref = new_node;        return head_ref;      # Else traverse till the last node    while (last.next != None):        last = last.next;      # Change the next of last node    last.next = new_node;         return head_ref;   # This function prints contents of# linked list starting from headdef printList(node):     while (node != None):        print(' ' + str(node.data), end = '')          if (node.next != None):            print('->', end = '')                     node = node.next;       # Function to get the size of linked listdef getSize(head):     if (head == None):        return 0;         return 1 + getSize(head.next); # Utility function to print the Linked List# from middle to left right orderdef printMiddleToLeftRightUtil(head, counter, lSize):     # Base Condition    # When size of list is odd    if (counter == 1 and lSize % 2 != 0):          # Print node value        print(head.data, end = '')          # Returns address of next node        return head.next;         # Base Condition    # When size of list is even    elif (counter == 1):          # Print node value        # and next node value        print(str(head.data) + ' , ' + str(head.next.data), end = '')          # Returns address of next to next node        return head.next.next;         else:          # Recursive function call and        # store return address        ptr = printMiddleToLeftRightUtil(head.next, counter - 1,lSize);          # Print head data        print(' , ' + str(head.data) + ' , ' + str(ptr.data), end = '')          # Returns address of next node        return ptr.next;      # Function to print Middle to# Left-right orderdef printMiddleToLeftRight(head):     # Function call to get the size    # Of Linked List    listSize = getSize(head);      middle = 0;      # Store middle when Linked    # List size is odd    if (listSize % 2 != 0):        middle = (listSize + 1) // 2;      # Store middle when Linked    # List size is even    else:        middle = listSize // 2;          # Utility function call print    # Linked List from Middle    # to left right order    print('Output :', end = ' ')      printMiddleToLeftRightUtil(head, middle, listSize);  # Driver codeif __name__=='__main__':         # Start with the empty list    head = None;      # Insert 6. So linked list    # becomes 6.None    head = append(head, 6);      # Insert 6. So linked list    # becomes 6.4.None    head = append(head, 4);    head = append(head, 8);    head = append(head, 7);    head = append(head, 9)    head = append(head, 11);    head = append(head, 2)         # After inserting linked list    # becomes 6.4.8.7.9.11.2.None    print("Created Linked list is:", end = ' ')      # Function to display Linked List content    printList(head);    print()      # Function call print Linked List from    # Middle to left right order    printMiddleToLeftRight(head);     # This code is contributed by rutvik_56
// A C# program to demonstrate// the printing of Linked List middle// to left right orderusing System; public class GFG{  // A linked list nodepublic class Node{    public int data;    public Node next;};  // Given a reference (pointer to pointer)// to the head of a list and an int, appends// a new node at the endstatic Node append(Node head_ref, int new_data){    // Allocate node    Node new_node = new Node();      // Used in step 5    Node last = head_ref;      // Put in the data    new_node.data = new_data;      // This new node is going to be    // the last node, so make next of    // it as null    new_node.next = null;      // If the Linked List is empty,    // then make the new node as head    if (head_ref == null)    {        head_ref = new_node;        return head_ref;    }      // Else traverse till the last node    while (last.next != null)        last = last.next;      // Change the next of last node    last.next = new_node;    return head_ref;}  // This function prints contents of// linked list starting from headstatic void printList(Node node){    while (node != null)    {        Console.Write( " " + node.data);          if (node.next != null)            Console.Write("->");        node = node.next;    }}  // Function to get the size of linked liststatic int getSize(Node head){    if (head == null)        return 0;    return 1 + getSize(head.next);}  // Utility function to print the Linked List// from middle to left right orderstatic Node printMiddleToLeftRightUtil(Node head,                          int counter, int lSize){    // Base Condition    // When size of list is odd    if (counter == 1 && lSize % 2 != 0)    {          // Print node value        Console.Write( head.data);          // Returns address of next node        return head.next;    }      // Base Condition    // When size of list is even    else if (counter == 1)    {          // Print node value        // and next node value        Console.Write(head.data);        Console.Write( " , " + head.next.data);          // Returns address of next to next node        return head.next.next;    }    else    {          // Recursive function call and        // store return address        Node ptr = printMiddleToLeftRightUtil(head.next,                                    counter - 1, lSize);          // Print head data        Console.Write(" , " + head.data);          // Print ptr data        Console.Write(" , " + ptr.data);          // Returns address of next node        return ptr.next;    }}  // Function to print Middle to// Left-right orderstatic void printMiddleToLeftRight(Node head){    // Function call to get the size    // Of Linked List    int listSize = getSize(head);      int middle = 0;      // Store middle when Linked    // List size is odd    if (listSize % 2 != 0)    {        middle = (listSize + 1) / 2;    }      // Store middle when Linked    // List size is even    else    {        middle = listSize / 2;    }      // Utility function call print    // Linked List from Middle    // to left right order    Console.Write("Output : ");      printMiddleToLeftRightUtil(head, middle, listSize);}  // Driver codepublic static void Main(String []args){    // Start with the empty list    Node head = null;      // Insert 6. So linked list    // becomes 6.null    head = append(head, 6);      // Insert 6. So linked list    // becomes 6.4.null    head = append(head, 4);    head = append(head, 8);    head = append(head, 7);    head = append(head, 9);    head = append(head, 11);    head = append(head, 2);      // After inserting linked list    // becomes 6.4.8.7.9.11.2.null    Console.Write("Created Linked list is: ");      // Function to display Linked List content    printList(head);    Console.WriteLine();      // Function call print Linked List from    // Middle to left right order    printMiddleToLeftRight(head);}} // This code is contributed by Rajput-Ji
<script> // JavaScript program to demonstrate// the printing of Linked List middle// to left right order // Structure of a node of the linked list class Node {        constructor() {        this.data = 0;        this.next = null;            }} // Given a reference (pointer to pointer)// to the head of a list and an int, appends// a new node at the endfunction append( head_ref,  new_data){    // Allocate node    var new_node = new Node();     // Used in step 5    var last = head_ref;     // Put in the data    new_node.data = new_data;     // This new node is going to be    // the last node, so make next of    // it as null    new_node.next = null;     // If the Linked List is empty,    // then make the new node as head    if (head_ref == null)    {        head_ref = new_node;        return head_ref;    }     // Else traverse till the last node    while (last.next != null)        last = last.next;     // Change the next of last node    last.next = new_node;    return head_ref;} // This function prints contents of// linked list starting from headfunction printList( node){    while (node != null)    {        document.write( " " + node.data);         if (node.next != null)            document.write("->");        node = node.next;    }} // Function to get the size of linked listfunction getSize( head){    if (head == null)        return 0;    return 1 + getSize(head.next);} // Utility function to print the Linked List// from middle to left right orderfunction printMiddleToLeftRightUtil( head, counter, lSize){    // Base Condition    // When size of list is odd    if (counter == 1 && lSize % 2 != 0)    {         // Print node value        document.write( head.data);         // Returns address of next node        return head.next;    }     // Base Condition    // When size of list is even    else if (counter == 1)    {         // Print node value        // and next node value        document.write(head.data);        document.write( " , " + head.next.data);         // Returns address of next to next node        return head.next.next;    }    else    {         // Recursive function call and        // store return address        var ptr = printMiddleToLeftRightUtil(head.next,                                    counter - 1, lSize);         // Print head data        document.write(" , " + head.data);         // Print ptr data        document.write(" , " + ptr.data);         // Returns address of next node        return ptr.next;    }} // Function to print Middle to// Left-right orderfunction printMiddleToLeftRight( head){    // Function call to get the size    // Of Linked List    let listSize = getSize(head);     let middle = 0;     // Store middle when Linked    // List size is odd    if (listSize % 2 != 0)    {        middle = Math.floor((listSize + 1) / 2);    }     // Store middle when Linked    // List size is even    else    {        middle = Math.floor(listSize / 2);    }     // Utility function call print    // Linked List from Middle    // to left right order    document.write("Output : ");     printMiddleToLeftRightUtil(head, middle, listSize);} // Driver Code // Start with the empty listvar head = null; // Insert 6. So linked list// becomes 6.nullhead = append(head, 6); // Insert 6. So linked list// becomes 6.4.nullhead = append(head, 4);head = append(head, 8);head = append(head, 7);head = append(head, 9);head = append(head, 11);head = append(head, 2); // After inserting linked list// becomes 6.4.8.7.9.11.2.nulldocument.write("Created Linked list is: "); // Function to display Linked List contentprintList(head);document.write("</br>"); // Function call print Linked List from// Middle to left right orderprintMiddleToLeftRight(head);     </script>
Created Linked list is:  6-> 4-> 8-> 7-> 9-> 11-> 2
Output : 7 , 8 , 9 , 4 , 11 , 6 , 2
 
andrew1234
Rajput-Ji
rutvik_56
jana_sayantan
Traversal
Linked List
Recursion
Linked List
Recursion
Traversal
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Circular Linked List | Set 2 (Traversal)
Swap nodes in a linked list without swapping data
Program to implement Singly Linked List in C++ using class
Circular Singly Linked List | Insertion
Given a linked list which is sorted, how will you insert in sorted way
Write a program to print all permutations of a given string
Given an array A[] and a number x, check for pair in A[] with sum as x (aka Two Sum)
Recursion
Program for Tower of Hanoi
Backtracking | Introduction