Bird
Raised Fist0
DSA Cprogramming~5 mins

Find Middle Element of Linked List in DSA C - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Find Middle Element of Linked List
O(n)
Understanding Time Complexity

We want to know how the time to find the middle element in a linked list changes as the list grows.

How many steps does it take to reach the middle as the list gets longer?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


struct Node {
    int data;
    struct Node* next;
};

int findMiddle(struct Node* head) {
    struct Node* slow = head;
    struct Node* fast = head;
    while (fast != NULL && fast->next != NULL) {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow->data;
}
    

This code uses two pointers moving at different speeds to find the middle node of a linked list.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: The while loop that moves the fast pointer two steps and the slow pointer one step each time.
  • How many times: About half the number of nodes in the list, since fast moves twice as fast.
How Execution Grows With Input

As the list size grows, the number of loop steps grows roughly half as fast.

Input Size (n)Approx. Operations
105
10050
1000500

Pattern observation: The steps increase linearly with input size, just about half as many steps as nodes.

Final Time Complexity

Time Complexity: O(n)

This means the time to find the middle grows directly with the number of nodes in the list.

Common Mistake

[X] Wrong: "Since the fast pointer jumps two steps, the time complexity is O(n/2), which is faster than O(n)."

[OK] Correct: We ignore constants in Big-O, so O(n/2) is the same as O(n). The time still grows linearly with input size.

Interview Connect

Understanding this method shows you can use clever pointer techniques to solve problems efficiently, a skill valued in many coding challenges.

Self-Check

"What if we used only one pointer to traverse the list once and counted nodes first, then traversed again to the middle? How would the time complexity change?"

Practice

(1/5)
1. What is the main idea behind finding the middle element of a singly linked list using the two-pointer technique?
easy
A. Count all nodes first, then access the middle by index
B. Reverse the list and pick the first element
C. Use two pointers both moving one step at a time
D. Use one slow pointer moving one step and one fast pointer moving two steps until fast reaches the end

Solution

  1. Step 1: Understand two-pointer technique

    One pointer moves one node at a time (slow), the other moves two nodes at a time (fast).
  2. Step 2: Identify middle when fast reaches end

    When fast pointer reaches the end, slow pointer will be at the middle node.
  3. Final Answer:

    Use one slow pointer moving one step and one fast pointer moving two steps until fast reaches the end -> Option D
  4. Quick Check:

    Two-pointer technique = slow one step, fast two steps [OK]
Hint: Move fast pointer twice as fast as slow pointer [OK]
Common Mistakes:
  • Moving both pointers at the same speed
  • Counting nodes first instead of using pointers
  • Reversing the list unnecessarily
2. Which of the following C code snippets correctly initializes pointers to find the middle of a linked list named head?
easy
A. Node *slow = head; Node *fast = NULL;
B. Node *slow = head; Node *fast = head;
C. Node *slow = head->next; Node *fast = head->next;
D. Node *slow = NULL; Node *fast = head;

Solution

  1. Step 1: Initialize both pointers at head

    Both slow and fast pointers start at the head node to traverse the list properly.
  2. Step 2: Check pointer initialization correctness

    Only Node *slow = head; Node *fast = head; initializes both pointers correctly at head; others start one pointer at NULL or next node incorrectly.
  3. Final Answer:

    Node *slow = head; Node *fast = head; -> Option B
  4. Quick Check:

    Both pointers start at head [OK]
Hint: Start both pointers at head node [OK]
Common Mistakes:
  • Starting one pointer at NULL
  • Starting pointers at next node instead of head
  • Not initializing pointers before loop
3. What will be the output of the following C code snippet that finds the middle element of a linked list?
typedef struct Node {
  int data;
  struct Node *next;
} Node;

int main() {
  Node n3 = {30, NULL};
  Node n2 = {20, &n3};
  Node n1 = {10, &n2};
  Node *head = &n1;

  Node *slow = head, *fast = head;
  while (fast != NULL && fast->next != NULL) {
    slow = slow->next;
    fast = fast->next->next;
  }
  printf("%d", slow->data);
  return 0;
}
medium
A. 30
B. 10
C. 20
D. Runtime error

Solution

  1. Step 1: Trace pointer movements

    Initially, slow and fast point to 10. After first loop, slow moves to 20, fast moves to 30. Next loop fast->next is NULL, loop ends.
  2. Step 2: Identify slow pointer position

    Slow pointer is at node with data 20, which is the middle element.
  3. Final Answer:

    20 -> Option C
  4. Quick Check:

    Middle element = 20 [OK]
Hint: Slow pointer stops at middle when fast reaches end [OK]
Common Mistakes:
  • Assuming middle is first node
  • Confusing fast pointer position with slow
  • Ignoring loop exit condition
4. Identify the error in the following code snippet intended to find the middle element of a linked list and select the correct fix.
Node *slow = head;
Node *fast = head;
while (fast != NULL) {
  slow = slow->next;
  fast = fast->next->next;
}
return slow->data;
medium
A. Change loop condition to while (fast != NULL && fast->next != NULL)
B. Initialize slow to head->next instead of head
C. Move slow pointer two steps instead of one
D. No error, code is correct

Solution

  1. Step 1: Analyze loop condition

    The loop checks only fast != NULL, but fast->next could be NULL causing fast->next->next to crash.
  2. Step 2: Correct loop condition

    Adding fast->next != NULL prevents dereferencing NULL pointer, avoiding runtime error.
  3. Final Answer:

    Change loop condition to while (fast != NULL && fast->next != NULL) -> Option A
  4. Quick Check:

    Check both fast and fast->next not NULL [OK]
Hint: Check both fast and fast->next in loop condition [OK]
Common Mistakes:
  • Not checking fast->next before accessing
  • Moving slow pointer incorrectly
  • Assuming code runs without null checks
5. Given a linked list with an even number of nodes, which node will the two-pointer method return as the middle element? Consider the list: 5 -> 10 -> 15 -> 20 -> NULL
hard
A. 15 (the second middle node)
B. 10 (the first middle node)
C. 5 (the head node)
D. 20 (the last node)

Solution

  1. Step 1: Trace pointers on even-length list

    Start slow and fast at 5. After first iteration, slow=10, fast=15. Next iteration, slow=15, fast=NULL (end).
  2. Step 2: Identify middle node returned

    When fast reaches NULL, slow points to 15, which is the second middle node in even-length list.
  3. Final Answer:

    15 (the second middle node) -> Option A
  4. Quick Check:

    Two-pointer method returns second middle in even list [OK]
Hint: Two-pointer method returns second middle in even-length list [OK]
Common Mistakes:
  • Assuming first middle is returned
  • Confusing head or last node as middle
  • Not tracing pointer steps carefully
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard