Bird
Raised Fist0
DSA Cprogramming~10 mins

Find Middle Element of Linked List in DSA C - Execution Trace

Choose your learning style10 modes available
Concept Flow - Find Middle Element of Linked List
Start: head points to first node
↓
Initialize two pointers: slow and fast at head
↓
Loop: fast != NULL and fast->next != NULL?
No→Stop
Yes↓
Move slow by 1 node
↓
Move fast by 2 nodes
↓
Repeat loop
↓
slow now points to middle node
↓
Return slow->data as middle element
Use two pointers moving at different speeds to find the middle node in one pass.
Execution Sample
DSA C
struct Node {
  int data;
  struct Node* next;
};

int findMiddle(struct Node* head) {
  struct Node *slow = head, *fast = head;
  while (fast && fast->next) {
    slow = slow->next;
    fast = fast->next->next;
  }
  return slow->data;
}
This code finds the middle element of a linked list using slow and fast pointers.
Execution Table
StepOperationslow Pointerfast PointerVisual State
1Initialize slow and fast at headNode(10)Node(10)┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ data:10│ → │ data:20│ → │ data:30│ → │ data:40│ → ∅ │ next:──┼──→│ next:──┼──→│ next:──┼──→│ next:∅ │ └────────┘ └────────┘ └────────┘ └────────┘ head
2Check fast and fast->next (fast=10, fast->next=20) - continueNode(10)Node(10)Same as step 1
3Move slow by 1 (slow=20), fast by 2 (fast=30)Node(20)Node(30)┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ data:10│ → │ data:20│ → │ data:30│ → │ data:40│ → ∅ │ next:──┼──→│ next:──┼──→│ next:──┼──→│ next:∅ │ └────────┘ └────────┘ └────────┘ └────────┘ head ↑slow ↑fast
4Check fast and fast->next (fast=30, fast->next=40) - continueNode(20)Node(30)Same as step 3
5Move slow by 1 (slow=30), fast by 2 (fast=NULL)Node(30)NULL┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ data:10│ → │ data:20│ → │ data:30│ → │ data:40│ → ∅ │ next:──┼──→│ next:──┼──→│ next:──┼──→│ next:∅ │ └────────┘ └────────┘ └────────┘ └────────┘ head ↑slow fast=NULL
6Check fast and fast->next (fast=NULL) - stop loopNode(30)NULLLoop ends, slow points to middle node
7Return slow->data as middle elementNode(30)NULLMiddle element is 30
💡 fast pointer reached NULL, loop ends; slow pointer is at middle node
Variable Tracker
VariableStartAfter Step 3After Step 5Final
slowNode(10)Node(20)Node(30)Node(30)
fastNode(10)Node(30)NULLNULL
Key Moments - 3 Insights
Why do we move fast pointer by two nodes but slow pointer by one?
Moving fast by two nodes and slow by one ensures that when fast reaches the end, slow is at the middle. See execution_table steps 3 and 5 where fast moves twice as fast as slow.
What happens if the list has even number of nodes?
The slow pointer will point to the second middle node when fast reaches NULL. This is shown in step 5 where slow points to Node(30) in a 4-node list.
Why does the loop stop when fast or fast->next is NULL?
Because fast moves two steps at a time, if fast or fast->next is NULL, it means we've reached the end or no further pairs exist. See step 6 where fast is NULL and loop stops.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what node does slow point to after step 3?
ANode with data 20
BNode with data 10
CNode with data 30
DNULL
💡 Hint
Check the 'slow Pointer' column in row for step 3 in execution_table
At which step does the fast pointer become NULL?
AStep 3
BStep 5
CStep 6
DStep 7
💡 Hint
Look at the 'fast Pointer' column in execution_table rows
If the list had 5 nodes instead of 4, where would slow point at loop end?
AThird node (middle)
BSecond node
CFourth node
DFifth node
💡 Hint
The slow pointer always points to the middle node; see concept_flow and variable_tracker
Concept Snapshot
Find Middle Element of Linked List:
- Use two pointers: slow and fast starting at head
- Move slow by 1 node, fast by 2 nodes in each loop
- Loop ends when fast or fast->next is NULL
- Slow pointer then points to middle node
- Works in one pass, O(n) time, O(1) space
Full Transcript
To find the middle element of a linked list, we use two pointers called slow and fast. Both start at the head of the list. In each step, slow moves one node forward, while fast moves two nodes forward. We keep doing this until fast reaches the end of the list or there is no next node for fast. At that point, slow will be pointing to the middle node. This method works for both even and odd length lists. For even length, slow points to the second middle node. This approach is efficient because it only requires one pass through the list and uses constant extra space.

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