# Find middle of singly linked list Recursively

Given a singly linked list and the task is to find the middle of the linked list.
Examples:

```Input  : 1->2->3->4->5
Output : 3

Input  : 1->2->3->4->5->6
Output : 4
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

We have already discussed Iterative Solution. In this post iterative solution is discussed. Count total number of nodes in the list in recursive manner and do half of this, suppose this value is n. Then rolling back through recursion decrement n by one for each call. Return the node where n is zero.

## C++

 `// C++ program for Recursive approach to find ` `// middle of singly linked list ` `#include ` `using` `namespace` `std; ` ` `  `// Tree Node Structure ` `struct` `Node ` `{ ` `    ``int` `data; ` `    ``struct` `Node* next; ` `}; ` ` `  `// Create new Node ` `Node* newLNode(``int` `data) ` `{ ` `    ``Node* temp = ``new` `Node; ` `    ``temp->data = data; ` `    ``temp->next = NULL; ` `    ``return` `temp; ` `} ` ` `  `// Function for finding midpoint recursively ` `void` `midpoint_util(Node* head, ``int``* n, Node** mid) ` `{ ` ` `  `    ``// If we reached end of linked list ` `    ``if` `(head == NULL) ` `    ``{ ` `        ``*n = (*n) / 2; ` `        ``return``; ` `    ``} ` ` `  `    ``*n = *n + 1; ` ` `  `    ``midpoint_util(head->next, n, mid); ` ` `  `    ``// Rolling back, decrement n by one ` `    ``*n = *n - 1; ` `    ``if` `(*n == 0) ` `    ``{ ` ` `  `        ``// Final answer ` `        ``*mid = head; ` `    ``} ` `} ` ` `  `Node* midpoint(Node* head) ` `{ ` `    ``Node* mid = NULL; ` `    ``int` `n = 1; ` `    ``midpoint_util(head, &n, &mid); ` `    ``return` `mid; ` `} ` ` `  `int` `main() ` `{ ` `    ``Node* head = newLNode(1); ` `    ``head->next = newLNode(2); ` `    ``head->next->next = newLNode(3); ` `    ``head->next->next->next = newLNode(4); ` `    ``head->next->next->next->next = newLNode(5); ` `    ``Node* result = midpoint(head); ` `    ``cout << result->data << endl; ` `    ``return` `0; ` `} `

## Java

 `// Java program for Recursive approach to find  ` `// middle of singly linked list  ` `class` `GFG ` `{ ` ` `  `// Tree Node Structure  ` `static` `class` `Node  ` `{  ` `    ``int` `data;  ` `    ``Node next;  ` `};  ` ` `  `// Create new Node  ` `static` `Node newLNode(``int` `data)  ` `{  ` `    ``Node temp = ``new` `Node();  ` `    ``temp.data = data;  ` `    ``temp.next = ``null``;  ` `    ``return` `temp;  ` `}  ` ` `  `static` `int` `n; ` `static` `Node mid; ` ` `  `// Function for finding midpoint recursively  ` `static` `void` `midpoint_util(Node head )  ` `{  ` ` `  `    ``// If we reached end of linked list  ` `    ``if` `(head == ``null``)  ` `    ``{  ` `        ``n = (n) / ``2``;  ` `        ``return``;  ` `    ``}  ` ` `  `    ``n = n + ``1``;  ` ` `  `    ``midpoint_util(head.next);  ` ` `  `    ``// Rolling back, decrement n by one  ` `    ``n = n - ``1``;  ` `    ``if` `(n == ``0``)  ` `    ``{  ` ` `  `        ``// Final answer  ` `        ``mid = head;  ` `    ``}  ` `}  ` ` `  `static` `Node midpoint(Node head)  ` `{  ` `    ``mid = ``null``;  ` `    ``n = ``1``;  ` `    ``midpoint_util(head);  ` `    ``return` `mid;  ` `}  ` ` `  `// Driver code ` `public` `static` `void` `main(String args[]) ` `{  ` `    ``Node head = newLNode(``1``);  ` `    ``head.next = newLNode(``2``);  ` `    ``head.next.next = newLNode(``3``);  ` `    ``head.next.next.next = newLNode(``4``);  ` `    ``head.next.next.next.next = newLNode(``5``);  ` `    ``Node result = midpoint(head);  ` `    ``System.out.print( result.data );  ` `} ` `}  ` ` `  `// This code is contributed by Arnab Kundu  `

## Python3

 `# Python3 program for Recursive approach ` `# to find middle of singly linked list ` ` `  `# Node class  ` `class` `Node:  ` ` `  `    ``# Function to initialise the node object  ` `    ``def` `__init__(``self``, data):  ` `        ``self``.data ``=` `data  ` `        ``self``.``next` `=` `None` `         `  `# Create new Node ` `def` `newLNode(data): ` ` `  `    ``temp ``=` `Node(data) ` `    ``temp.data ``=` `data ` `    ``temp.``next` `=` `None` `    ``return` `temp ` ` `  `mid ``=` `None` `n ``=` `0` ` `  `# Function for finding midpoint recursively ` `def` `midpoint_util(head ): ` ` `  `    ``global` `n ` `    ``global` `mid ` `     `  `    ``# If we reached end of linked list ` `    ``if` `(head ``=``=` `None``): ` `     `  `        ``n ``=` `int``((n) ``/` `2``) ` `        ``return` `     `  `    ``n ``=` `n ``+` `1` ` `  `    ``midpoint_util(head.``next``) ` ` `  `    ``# Rolling back, decrement n by one ` `    ``n ``=` `n ``-` `1` `    ``if` `(n ``=``=` `0``): ` `     `  `        ``# Final answer ` `        ``mid ``=` `head ` ` `  `def` `midpoint(head): ` ` `  `    ``global` `n ` `    ``global` `mid ` `     `  `    ``mid ``=` `None` `    ``n ``=` `1` `    ``midpoint_util(head) ` `    ``return` `mid ` ` `  `# Driver Code  ` `if` `__name__``=``=``'__main__'``:  ` `     `  `    ``head ``=` `newLNode(``1``) ` `    ``head.``next` `=` `newLNode(``2``) ` `    ``head.``next``.``next` `=` `newLNode(``3``) ` `    ``head.``next``.``next``.``next` `=` `newLNode(``4``) ` `    ``head.``next``.``next``.``next``.``next` `=` `newLNode(``5``) ` `    ``result ``=` `midpoint(head) ` `    ``print``( result.data ) ` `     `  `# This code is contributed by Arnab Kundu `

## C#

 `// C# program for Recursive approach to find  ` `// middle of singly linked list  ` `using` `System;  ` `class` `GFG ` `{ ` ` `  `// Tree Node Structure  ` `public` `class` `Node  ` `{  ` `    ``public` `int` `data;  ` `    ``public` `Node next;  ` `};  ` ` `  `// Create new Node  ` `static` `Node newLNode(``int` `data)  ` `{  ` `    ``Node temp = ``new` `Node();  ` `    ``temp.data = data;  ` `    ``temp.next = ``null``;  ` `    ``return` `temp;  ` `}  ` ` `  `static` `int` `n; ` `static` `Node mid; ` ` `  `// Function for finding midpoint recursively  ` `static` `void` `midpoint_util(Node head )  ` `{  ` ` `  `    ``// If we reached end of linked list  ` `    ``if` `(head == ``null``)  ` `    ``{  ` `        ``n = (n) / 2;  ` `        ``return``;  ` `    ``}  ` ` `  `    ``n = n + 1;  ` ` `  `    ``midpoint_util(head.next);  ` ` `  `    ``// Rolling back, decrement n by one  ` `    ``n = n - 1;  ` `    ``if` `(n == 0)  ` `    ``{  ` ` `  `        ``// Final answer  ` `        ``mid = head;  ` `    ``}  ` `}  ` ` `  `static` `Node midpoint(Node head)  ` `{  ` `    ``mid = ``null``;  ` `    ``n = 1;  ` `    ``midpoint_util(head);  ` `    ``return` `mid;  ` `}  ` ` `  `// Driver code ` `public` `static` `void` `Main() ` `{  ` `    ``Node head = newLNode(1);  ` `    ``head.next = newLNode(2);  ` `    ``head.next.next = newLNode(3);  ` `    ``head.next.next.next = newLNode(4);  ` `    ``head.next.next.next.next = newLNode(5);  ` `    ``Node result = midpoint(head);  ` `    ``Console.WriteLine( result.data );  ` `} ` `} ` ` `  `// This code is contributed by Rajput-Ji `

Output:

`3`

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Improved By : andrew1234, Rajput-Ji

Article Tags :
Practice Tags :

2

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.