Learnitweb

Finding the Middle Node of a Linked List in Java

In this tutorial, we will explore different approaches to find the middle node of a linked list in Java. This is a common coding interview question, and understanding its logic is essential for working with linked lists.

Approach 1: Using Slow and Fast Pointers (Tortoise and Hare Algorithm)

Logic

This is the most common and efficient method to find the middle node of a linked list. The approach uses two pointers:

  • Slow Pointer: Moves one step at a time.
  • Fast Pointer: Moves two steps at a time.

When the fast pointer reaches the end of the list, the slow pointer will be at the middle.

Java Code

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
class Node {
int data;
Node next;
Node(int data) {
this.data = data;
this.next = null;
}
}
public class LinkedList {
Node head;
public Node findMiddle() {
Node slow = head;
Node fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public void insert(int data) {
Node newNode = new Node(data);
if (head == null) {
head = newNode;
return;
}
Node temp = head;
while (temp.next != null) {
temp = temp.next;
}
temp.next = newNode;
}
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.insert(1);
list.insert(2);
list.insert(3);
list.insert(4);
list.insert(5);
Node middleNode = list.findMiddle();
System.out.println("Middle Node: " + middleNode.data);
}
}
class Node { int data; Node next; Node(int data) { this.data = data; this.next = null; } } public class LinkedList { Node head; public Node findMiddle() { Node slow = head; Node fast = head; while (fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; } return slow; } public void insert(int data) { Node newNode = new Node(data); if (head == null) { head = newNode; return; } Node temp = head; while (temp.next != null) { temp = temp.next; } temp.next = newNode; } public static void main(String[] args) { LinkedList list = new LinkedList(); list.insert(1); list.insert(2); list.insert(3); list.insert(4); list.insert(5); Node middleNode = list.findMiddle(); System.out.println("Middle Node: " + middleNode.data); } }
class Node {
    int data;
    Node next;

    Node(int data) {
        this.data = data;
        this.next = null;
    }
}

public class LinkedList {
    Node head;

    public Node findMiddle() {
        Node slow = head;
        Node fast = head;

        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }

        return slow;
    }

    public void insert(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
            return;
        }
        Node temp = head;
        while (temp.next != null) {
            temp = temp.next;
        }
        temp.next = newNode;
    }

    public static void main(String[] args) {
        LinkedList list = new LinkedList();
        list.insert(1);
        list.insert(2);
        list.insert(3);
        list.insert(4);
        list.insert(5);

        Node middleNode = list.findMiddle();
        System.out.println("Middle Node: " + middleNode.data);
    }
}

Output

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Middle Node: 3
Middle Node: 3
Middle Node: 3

Time Complexity

O(n) – It traverses the list once.

Space Complexity

O(1) – It uses constant space for the two pointers.

Approach 2: Using Length of the Linked List

Logic

  1. Traverse the linked list to count the number of nodes.
  2. Traverse again to find the middle node using the formula:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
middleIndex = length / 2
middleIndex = length / 2
middleIndex = length / 2

Java Code

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public Node findMiddle() {
int length = 0;
Node temp = head;
while (temp != null) {
length++;
temp = temp.next;
}
temp = head;
for (int i = 0; i < length / 2; i++) {
temp = temp.next;
}
return temp;
}
public Node findMiddle() { int length = 0; Node temp = head; while (temp != null) { length++; temp = temp.next; } temp = head; for (int i = 0; i < length / 2; i++) { temp = temp.next; } return temp; }
public Node findMiddle() {
    int length = 0;
    Node temp = head;

    while (temp != null) {
        length++;
        temp = temp.next;
    }

    temp = head;
    for (int i = 0; i < length / 2; i++) {
        temp = temp.next;
    }

    return temp;
}

Time Complexity

O(n) – Two traversals are required.

Space Complexity

O(1) – No extra space is used.

Approach 3: Using Two Pointers from Both Ends (For Doubly Linked List)

If you are working with a doubly linked list (DLL), you can use two pointers:

  • One starts from the head.
  • One starts from the tail.
  • Move both towards the center until they meet.

Java Code

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public Node findMiddle(Node head, Node tail) {
while (head != tail && head.next != tail) {
head = head.next;
tail = tail.previous;
}
return head;
}
public Node findMiddle(Node head, Node tail) { while (head != tail && head.next != tail) { head = head.next; tail = tail.previous; } return head; }
public Node findMiddle(Node head, Node tail) {
    while (head != tail && head.next != tail) {
        head = head.next;
        tail = tail.previous;
    }
    return head;
}

Time Complexity

O(n/2) – But resolves to O(n).

Space Complexity

O(1).