Auxiliary Given a singly linked list, find the middle of the linked list. For example, if the given linked list is 1->2->3->4->5 then the output should be 3.
If there are even nodes, then there would be two middle nodes, we need to print the second middle element.
For example, if the given linked list is 1->2->3->4->5->6 then the output should be 4.
Easy And Brute Force Way:
The Approach:
Here in this approach, we use O(n) extra space for vector to store the linked list values and we simply return middle value of vector.
C++
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
class Node{
public :
int data;
Node *next;
};
class NodeOperation{
public :
void pushNode( class Node** head_ref, int data_val){
class Node *new_node = new Node();
new_node->data = data_val;
new_node->next = *head_ref;
*head_ref = new_node;
}
};
int main() {
class Node *head = NULL;
class NodeOperation *temp = new NodeOperation();
for ( int i=5; i>0; i--){
temp->pushNode(&head, i);
}
vector< int >v;
while (head!=NULL){
v.push_back(head->data);
head=head->next;
}
cout<< "Middle Value Of Linked List is :" ;
cout<<v[v.size()/2]<<endl;
return 0;
}
|
Python3
class Node:
def __init__( self , data = None , next = None ):
self .data = data
self . next = next
class NodeOperation:
def pushNode( self , head_ref, data_val):
new_node = Node(data = data_val)
new_node. next = head_ref[ 0 ]
head_ref[ 0 ] = new_node
if __name__ = = "__main__" :
head = [ None ]
temp = NodeOperation()
for i in range ( 5 , 0 , - 1 ):
temp.pushNode(head, i)
v = []
while head[ 0 ]:
v.append(head[ 0 ].data)
head[ 0 ] = head[ 0 ]. next
print ( "Middle Value Of Linked List is :" , v[ len (v) / / 2 ])
|
Java
import java.util.ArrayList;
class Node {
public int data;
public Node next;
}
class NodeOperation {
public void pushNode(Node[] headRef, int dataVal) {
Node newNode = new Node();
newNode.data = dataVal;
newNode.next = headRef[ 0 ];
headRef[ 0 ] = newNode;
}
}
public class Main {
public static void main(String[] args) {
Node[] head = new Node[ 1 ];
NodeOperation temp = new NodeOperation();
for ( int i = 5 ; i > 0 ; i--) {
temp.pushNode(head, i);
}
ArrayList<Integer> v = new ArrayList<Integer>();
Node curr = head[ 0 ];
while (curr != null ) {
v.add(curr.data);
curr = curr.next;
}
System.out.print( "Middle Value Of Linked List is : " );
System.out.println(v.get(v.size() / 2 ));
}
}
|
Javascript
class Node {
constructor() {
this .data = null ;
this .next = null ;
}
}
class NodeOperation {
pushNode(headRef, dataVal) {
const newNode = new Node();
newNode.data = dataVal;
newNode.next = headRef[0];
headRef[0] = newNode;
}
}
const head = [ null ];
const temp = new NodeOperation();
for (let i = 5; i > 0; i--) {
temp.pushNode(head, i);
}
const v = [];
let curr = head[0];
while (curr !== null ) {
v.push(curr.data);
curr = curr.next;
}
var middle = Math.floor(v.length / 2);
console.log( "Middle Value Of Linked List is : " + v[middle]);
|
C#
using System;
using System.Collections.Generic;
class Node {
public int data;
public Node next;
}
class NodeOperation {
public void pushNode( ref Node head_ref, int data_val)
{
Node new_node = new Node();
new_node.data = data_val;
new_node.next = head_ref;
head_ref = new_node;
}
}
public class GFG {
static public void Main()
{
Node head = null ;
NodeOperation temp = new NodeOperation();
for ( int i = 5; i > 0; i--) {
temp.pushNode( ref head, i);
}
List< int > v = new List< int >();
while (head != null ) {
v.Add(head.data);
head = head.next;
}
Console.Write( "Middle Value Of Linked List is : " );
Console.Write(v[v.Count / 2]);
Console.WriteLine();
}
}
|
Output
Middle Value Of Linked List is :3
Complexity Analysis:
Time Complexity: O(n), for traversing.
Auxiliary Space: O(n), for Vector.
Method 1: Traverse the whole linked list and count the no. of nodes. Now traverse the list again till count/2 and return the node at count/2.
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
class Node {
public :
int data;
Node* next;
};
class NodeOperation {
public :
void pushNode( class Node** head_ref, int data_val)
{
class Node* new_node = new Node();
new_node->data = data_val;
new_node->next = *head_ref;
*head_ref = new_node;
}
void printNode( class Node* head)
{
while (head != NULL) {
cout << head->data << "->" ;
head = head->next;
}
cout << "NULL" << endl;
}
int getLen( class Node* head)
{
int len = 0;
class Node* temp = head;
while (temp) {
len++;
temp = temp->next;
}
return len;
}
void printMiddle( class Node* head)
{
if (head) {
int len = getLen(head);
class Node* temp = head;
int midIdx = len / 2;
while (midIdx--) {
temp = temp->next;
}
cout << "The middle element is [" << temp->data
<< "]" << endl;
}
}
};
int main()
{
class Node* head = NULL;
class NodeOperation* temp = new NodeOperation();
for ( int i = 5; i > 0; i--) {
temp->pushNode(&head, i);
temp->printNode(head);
temp->printMiddle(head);
}
return 0;
}
|
Java
import java.io.*;
class GFG {
Node head;
class Node {
int data;
Node next;
public Node( int data)
{
this .data = data;
this .next = null ;
}
}
public void pushNode( int data)
{
Node new_node = new Node(data);
new_node.next = head;
head = new_node;
}
public void printNode()
{
Node temp = head;
while (temp != null ) {
System.out.print(temp.data + "->" );
temp = temp.next;
}
System.out.print( "Null"
+ "\n" );
}
public int getLen()
{
int length = 0 ;
Node temp = head;
while (temp != null ) {
length++;
temp = temp.next;
}
return length;
}
public void printMiddle()
{
if (head != null ) {
int length = getLen();
Node temp = head;
int middleLength = length / 2 ;
while (middleLength != 0 ) {
temp = temp.next;
middleLength--;
}
System.out.print( "The middle element is ["
+ temp.data + "]" );
System.out.println();
}
}
public static void main(String[] args)
{
GFG list = new GFG();
for ( int i = 5 ; i >= 1 ; i--) {
list.pushNode(i);
list.printNode();
list.printMiddle();
}
}
}
|
Python3
class Node:
def __init__( self , data):
self .data = data
self . next = None
class NodeOperation:
def pushNode( self , head_ref, data_val):
new_node = Node(data_val)
new_node. next = head_ref
head_ref = new_node
return head_ref
def printNode( self , head):
while (head ! = None ):
print ( '%d->' % head.data, end = "")
head = head. next
print ( "NULL" )
def getLen( self , head):
temp = head
len = 0
while (temp ! = None ):
len + = 1
temp = temp. next
return len
def printMiddle( self , head):
if head ! = None :
len = self .getLen(head)
temp = head
midIdx = len / / 2
while midIdx ! = 0 :
temp = temp. next
midIdx - = 1
print ( 'The middle element is [ %d ]' % temp.data)
head = None
temp = NodeOperation()
for i in range ( 5 , 0 , - 1 ):
head = temp.pushNode(head, i)
temp.printNode(head)
temp.printMiddle(head)
|
Javascript
<script>
var head;
class Node {
constructor(val) {
this .data = val;
this .next = null ;
}
}
function pushNode(new_data) {
var new_node = new Node(new_data);
new_node.next = head;
head = new_node;
}
function printNode() {
var tnode = head;
while (tnode != null ) {
document.write(tnode.data + "->" );
tnode = tnode.next;
}
document.write( "NULL<br/>" );
}
function getLen(){
let length = 0;
var temp = head;
while (temp!= null ){
length+=1;
temp = temp.next;
}
return length;
}
function printMiddle(){
if (head!= null ){
let length = getLen();
var temp = head;
let middleLength = length/2;
while (parseInt(middleLength)!=0){
temp = temp.next;
middleLength--;
}
document.write( "The middle element is [" + temp.data + "]<br/><br/>" );
}
}
for (let i = 5; i >= 1; --i) {
pushNode(i);
printNode();
printMiddle();
}
</script>
|
C#
using System;
public class GFG {
class Node {
public int data;
public Node next;
public Node( int data)
{
this .data = data;
this .next = null ;
}
}
Node head;
public void pushNode( int data)
{
Node new_node = new Node(data);
new_node.next = head;
head = new_node;
}
public void printNode()
{
Node temp = head;
while (temp != null ) {
Console.Write(temp.data + "->" );
temp = temp.next;
}
Console.Write( "Null"
+ "\n" );
}
public int getLen()
{
int length = 0;
Node temp = head;
while (temp != null ) {
length++;
temp = temp.next;
}
return length;
}
public void printMiddle()
{
if (head != null ) {
int length = getLen();
Node temp = head;
int middleLength = length / 2;
while (middleLength != 0) {
temp = temp.next;
middleLength--;
}
Console.Write( "The middle element is ["
+ temp.data + "]" );
Console.WriteLine();
}
}
static public void Main()
{
GFG list = new GFG();
for ( int i = 5; i >= 1; i--) {
list.pushNode(i);
list.printNode();
list.printMiddle();
}
}
}
|
Output
5->NULL
The middle element is [5]
4->5->NULL
The middle element is [5]
3->4->5->NULL
The middle element is [4]
2->3->4->5->NULL
The middle element is [4]
1->2->3->4->5->NULL
The middle element is [3]
Time Complexity: O(n) where n is no of nodes in linked list
Auxiliary Space: O(1)
Method 2: Traverse linked list using two-pointers. Move one pointer by one and the other pointers by two. When the fast pointer reaches the end, the slow pointer will reach the middle of the linked list.
Below image shows how printMiddle function works in the code :

C
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int data;
struct Node* next;
};
void printMiddle( struct Node *head)
{
struct Node *slow_ptr = head;
struct Node *fast_ptr = head;
if (head!=NULL)
{
while (fast_ptr != NULL && fast_ptr->next != NULL)
{
fast_ptr = fast_ptr->next->next;
slow_ptr = slow_ptr->next;
}
printf ( "The middle element is [ %d ]\n\n" , slow_ptr->data);
}
}
void push( struct Node** head_ref, int new_data)
{
struct Node* new_node =
( struct Node*) malloc ( sizeof ( struct Node));
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
void printList( struct Node *ptr)
{
while (ptr != NULL)
{
printf ( "%d->" , ptr->data);
ptr = ptr->next;
}
printf ( "NULL\n" );
}
int main()
{
struct Node* head = NULL;
int i;
for (i=5; i>0; i--)
{
push(&head, i);
printList(head);
printMiddle(head);
}
return 0;
}
|
C++
#include <iostream>
using namespace std;
class Node{
public :
int data;
Node *next;
};
class NodeOperation{
public :
void pushNode( class Node** head_ref, int data_val){
class Node *new_node = new Node();
new_node->data = data_val;
new_node->next = *head_ref;
*head_ref = new_node;
}
void printNode( class Node *head){
while (head != NULL){
cout <<head->data << "->" ;
head = head->next;
}
cout << "NULL" << endl;
}
void printMiddle( class Node *head){
struct Node *slow_ptr = head;
struct Node *fast_ptr = head;
if (head!=NULL)
{
while (fast_ptr != NULL && fast_ptr->next != NULL)
{
fast_ptr = fast_ptr->next->next;
slow_ptr = slow_ptr->next;
}
cout << "The middle element is [" << slow_ptr->data << "]" << endl;
}
}
};
int main(){
class Node *head = NULL;
class NodeOperation *temp = new NodeOperation();
for ( int i=5; i>0; i--){
temp->pushNode(&head, i);
temp->printNode(head);
temp->printMiddle(head);
}
return 0;
}
|
Java
import java.io.*;
class LinkedList {
Node head;
class Node {
int data;
Node next;
Node( int d)
{
data = d;
next = null ;
}
}
void printMiddle()
{
Node slow_ptr = head;
Node fast_ptr = head;
while (fast_ptr != null && fast_ptr.next != null ) {
fast_ptr = fast_ptr.next.next;
slow_ptr = slow_ptr.next;
}
System.out.println( "The middle element is ["
+ slow_ptr.data + "] \n" );
}
public void push( int new_data)
{
Node new_node = new Node(new_data);
new_node.next = head;
head = new_node;
}
public void printList()
{
Node tnode = head;
while (tnode != null ) {
System.out.print(tnode.data + "->" );
tnode = tnode.next;
}
System.out.println( "NULL" );
}
public static void main(String[] args)
{
LinkedList llist = new LinkedList();
for ( int i = 5 ; i > 0 ; --i) {
llist.push(i);
llist.printList();
llist.printMiddle();
}
}
}
|
Python3
class Node:
def __init__( self , data):
self .data = data
self . next = None
class LinkedList:
def __init__( self ):
self .head = None
def push( self , new_data):
new_node = Node(new_data)
new_node. next = self .head
self .head = new_node
def printList( self ):
node = self .head
while node:
print ( str (node.data) + "->" , end = "")
node = node. next
print ( "NULL" )
def printMiddle( self ):
slow = self .head
fast = self .head
while fast and fast. next :
slow = slow. next
fast = fast. next . next
print ( "The middle element is " , slow.data)
if __name__ = = '__main__' :
llist = LinkedList()
for i in range ( 5 , 0 , - 1 ):
llist.push(i)
llist.printList()
llist.printMiddle()
|
Javascript
<script>
var head;
class Node {
constructor(val) {
this .data = val;
this .next = null ;
}
}
function printMiddle()
{
var slow_ptr = head;
var fast_ptr = head;
if (head != null )
{
while (fast_ptr != null &&
fast_ptr.next != null )
{
fast_ptr = fast_ptr.next.next;
slow_ptr = slow_ptr.next;
}
document.write(
"The middle element is [" + slow_ptr.data + "] <br/><br/>"
);
}
}
function push(new_data) {
var new_node = new Node(new_data);
new_node.next = head;
head = new_node;
}
function printList() {
var tnode = head;
while (tnode != null ) {
document.write(tnode.data + "->" );
tnode = tnode.next;
}
document.write( "NULL<br/>" );
}
for (i = 5; i > 0; --i) {
push(i);
printList();
printMiddle();
}
</script>
|
C#
using System;
class LinkedList{
Node head;
class Node
{
public int data;
public Node next;
public Node( int d)
{
data = d;
next = null ;
}
}
void printMiddle()
{
Node slow_ptr = head;
Node fast_ptr = head;
if (head != null )
{
while (fast_ptr != null &&
fast_ptr.next != null )
{
fast_ptr = fast_ptr.next.next;
slow_ptr = slow_ptr.next;
}
Console.WriteLine( "The middle element is [" +
slow_ptr.data + "] \n" );
}
}
public void push( int new_data)
{
Node new_node = new Node(new_data);
new_node.next = head;
head = new_node;
}
public void printList()
{
Node tnode = head;
while (tnode != null )
{
Console.Write(tnode.data + "->" );
tnode = tnode.next;
}
Console.WriteLine( "NULL" );
}
static public void Main()
{
LinkedList llist = new LinkedList();
for ( int i = 5; i > 0; --i)
{
llist.push(i);
llist.printList();
llist.printMiddle();
}
}
}
|
Output
5->NULL
The middle element is [5]
4->5->NULL
The middle element is [5]
3->4->5->NULL
The middle element is [4]
2->3->4->5->NULL
The middle element is [4]
1->2->3->4->5->NULL
The middle element is [3]
Time Complexity: O(N), As we are traversing the list only once.
Auxiliary Space: O(1), As constant extra space is used.
Method 3: Initialize the mid element as head and initialize a counter as 0. Traverse the list from the head, while traversing increment the counter and change mid to mid->next whenever the counter is odd. So the mid will move only half of the total length of the list.
Thanks to Narendra Kangralkar for suggesting this method.
C++
#include <bits/stdc++.h>
using namespace std;
struct node
{
int data;
struct node* next;
};
void printMiddle( struct node* head)
{
int count = 0;
struct node* mid = head;
while (head != NULL)
{
if (count & 1)
mid = mid->next;
++count;
head = head->next;
}
if (mid != NULL)
printf ( "The middle element is [%d]\n\n" ,
mid->data);
}
void push( struct node** head_ref, int new_data)
{
struct node* new_node = ( struct node*) malloc (
sizeof ( struct node));
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
void printList( struct node* ptr)
{
while (ptr != NULL)
{
printf ( "%d->" , ptr->data);
ptr = ptr->next;
}
printf ( "NULL\n" );
}
int main()
{
struct node* head = NULL;
int i;
for (i = 5; i > 0; i--)
{
push(&head, i);
printList(head);
printMiddle(head);
}
return 0;
}
|
C
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node* next;
};
void printMiddle( struct node* head)
{
int count = 0;
struct node* mid = head;
while (head != NULL) {
if (count & 1)
mid = mid->next;
++count;
head = head->next;
}
if (mid != NULL)
printf ( "The middle element is [ %d ]\n\n" , mid->data);
}
void push( struct node** head_ref, int new_data)
{
struct node* new_node
= ( struct node*) malloc ( sizeof ( struct node));
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
void printList( struct node* ptr)
{
while (ptr != NULL) {
printf ( "%d->" , ptr->data);
ptr = ptr->next;
}
printf ( "NULL\n" );
}
int main()
{
struct node* head = NULL;
int i;
for (i = 5; i > 0; i--) {
push(&head, i);
printList(head);
printMiddle(head);
}
return 0;
}
|
Java
import java.io.*;
class GFG {
static Node head;
class Node {
int data;
Node next;
public Node(Node next, int data)
{
this .data = data;
this .next = next;
}
}
void printMiddle(Node head)
{
int count = 0 ;
Node mid = head;
while (head != null ) {
if ((count % 2 ) == 1 )
mid = mid.next;
++count;
head = head.next;
}
if (mid != null )
System.out.println( "The middle element is ["
+ mid.data + "]\n" );
}
void push(Node head_ref, int new_data)
{
Node new_node = new Node(head_ref, new_data);
head = new_node;
}
void printList(Node head)
{
while (head != null ) {
System.out.print(head.data + "-> " );
head = head.next;
}
System.out.println( "null" );
}
public static void main(String[] args)
{
GFG ll = new GFG();
for ( int i = 5 ; i > 0 ; i--) {
ll.push(head, i);
ll.printList(head);
ll.printMiddle(head);
}
}
}
|
Python3
class Node:
def __init__( self , data):
self .data = data
self . next = None
class LinkedList:
def __init__( self ):
self .head = None
def push( self , new_data):
new_node = Node(new_data)
new_node. next = self .head
self .head = new_node
def printList( self ):
node = self .head
while node:
print ( str (node.data) + "->" , end = "")
node = node. next
print ( "NULL" )
def printMiddle( self ):
count = 0
mid = self .head
heads = self .head
while (heads ! = None ):
if count& 1 :
mid = mid. next
count + = 1
heads = heads. next
if mid! = None :
print ( "The middle element is " , mid.data)
if __name__ = = '__main__' :
llist = LinkedList()
for i in range ( 5 , 0 , - 1 ):
llist.push(i)
llist.printList()
llist.printMiddle()
|
C#
using System;
public class GFG
{
static Node head;
public
class Node {
public
int data;
public
Node next;
public Node(Node next, int data) {
this .data = data;
this .next = next;
}
}
void printMiddle(Node head) {
int count = 0;
Node mid = head;
while (head != null ) {
if ((count % 2) == 1)
mid = mid.next;
++count;
head = head.next;
}
if (mid != null )
Console.WriteLine( "The middle element is [" + mid.data + "]\n" );
}
public void Push(Node head_ref, int new_data) {
Node new_node = new Node(head_ref, new_data);
head = new_node;
}
void printList(Node head) {
while (head != null ) {
Console.Write(head.data + "-> " );
head = head.next;
}
Console.WriteLine( "null" );
}
public static void Main(String[] args) {
GFG ll = new GFG();
for ( int i = 5; i > 0; i--) {
ll.Push(head, i);
ll.printList(head);
ll.printMiddle(head);
}
}
}
|
Javascript
<script>
var head= null ;
class Node {
constructor(next,val) {
this .data = val;
this .next = next;
}
}
function printMiddle(head) {
var count = 0;
var mid = head;
while (head != null ) {
if ((count % 2) == 1)
mid = mid.next;
++count;
head = head.next;
}
if (mid != null )
document.write( "The middle element is [" + mid.data + "]<br/><br/>" );
}
function push(head_ref , new_data) {
var new_node = new Node(head_ref, new_data);
head = new_node;
return head;
}
function printList(head) {
while (head != null ) {
document.write(head.data + "-> " );
head = head.next;
}
document.write( "null<br/>" );
}
for (i = 5; i > 0; i--) {
head= push(head, i);
printList(head);
printMiddle(head);
}
</script>
|
Output
5->NULL
The middle element is [5]
4->5->NULL
The middle element is [5]
3->4->5->NULL
The middle element is [4]
2->3->4->5->NULL
The middle element is [4]
1->2->3->4->5->NULL
The middle element is [3]
Time Complexity: O(N), As we are traversing the list once.
Auxiliary Space: O(1), As constant extra space is used.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!