Bird
Raised Fist0
DSA Rustprogramming~30 mins

Find Middle Element of Linked List in DSA Rust - Build from Scratch

Choose your learning style10 modes available
Find Middle Element of Linked List
📖 Scenario: You are working with a simple linked list that stores numbers. You want to find the middle number in the list, just like finding the middle person in a line.
🎯 Goal: Build a Rust program that creates a linked list, sets up a way to find the middle element, and then prints that middle element.
📋 What You'll Learn
Create a linked list with exactly 5 nodes containing the values 10, 20, 30, 40, 50 in that order.
Create a variable to help find the middle element using the two-pointer technique.
Write the logic to find the middle element by moving pointers through the list.
Print the value of the middle node.
💡 Why This Matters
🌍 Real World
Finding the middle element of a linked list is useful in many applications like splitting data into halves, balancing tasks, or optimizing searches.
💼 Career
Understanding linked lists and pointer techniques is important for software developers working with low-level data structures, memory management, and algorithm optimization.
Progress0 / 4 steps
1
Create the Linked List
Create a linked list with nodes containing the values 10, 20, 30, 40, and 50 in that order. Use the provided Node struct and create a variable called head pointing to the first node.
DSA Rust
Hint

Start from the last node with value: 50 and next: None, then wrap each node inside the previous one using Some(Box::new(Node { ... })).

2
Set Up Pointers to Find Middle
Create two variables called slow and fast and set both to point to head.as_ref(). These will help you find the middle element by moving through the list at different speeds.
DSA Rust
Hint

Use head.as_ref() to get a reference to the first node, then assign it to both slow and fast variables.

3
Find the Middle Element Using Two Pointers
Write a while loop that moves fast two steps and slow one step forward until fast reaches the end of the list. Use fast.unwrap().next.as_ref() to move fast and slow.unwrap().next.as_ref() to move slow.
DSA Rust
Hint

Check that fast and fast.unwrap().next are Some before moving pointers. Move slow one step and fast two steps inside the loop.

4
Print the Middle Element
Print the value of the middle node using slow.unwrap().value. Use println!("{}", slow.unwrap().value).
DSA Rust
Hint

Use println!("{}", slow.unwrap().value) to print the middle node's value.

Practice

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

Solution

  1. Step 1: Understand two-pointer technique

    The slow pointer moves one node at a time, while the fast pointer moves two nodes at a time.
  2. Step 2: Identify middle when fast pointer reaches the end

    When the fast pointer reaches the end of the list, the 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 B
  4. Quick Check:

    Two-pointer technique = Use one slow pointer moving one step and one fast pointer moving two steps until fast reaches the end [OK]
Hint: Move fast pointer twice as fast as slow pointer [OK]
Common Mistakes:
  • Trying to count nodes first wastes time
  • Reversing list is unnecessary
  • Using extra space like stack is inefficient
2. Which of the following Rust code snippets correctly initializes a singly linked list node with value 5?
easy
A. let node = Node::new(5, None);
B. let node = Node(value: 5, next: None);
C. let node = Node { value: 5, next: None };
D. let node = Node { 5, None };

Solution

  1. Step 1: Recall Rust struct initialization syntax

    Rust structs are initialized with field names and values inside curly braces.
  2. Step 2: Match correct syntax for Node struct

    Using Node { value: 5, next: None } matches Rust's struct initialization rules.
  3. Final Answer:

    let node = Node { value: 5, next: None }; -> Option C
  4. Quick Check:

    Rust struct init = let node = Node { value: 5, next: None }; [OK]
Hint: Use field names inside braces to initialize structs [OK]
Common Mistakes:
  • Using parentheses instead of braces
  • Omitting field names
  • Trying to call a constructor that doesn't exist
3. What will be the output of the following Rust code that finds the middle element of a linked list?
struct Node {
    value: i32,
    next: Option,
}

fn find_middle(head: &Option) -> i32 {
    let mut slow = head;
    let mut fast = head;
    while fast.is_some() && fast.as_ref().unwrap().next.is_some() {
        slow = &slow.as_ref().unwrap().next;
        fast = &fast.as_ref().unwrap().next.as_ref().unwrap().next;
    }
    slow.as_ref().unwrap().value
}

fn main() {
    let node3 = Node { value: 3, next: None };
    let node2 = Node { value: 2, next: Some(Box::new(node3)) };
    let node1 = Node { value: 1, next: Some(Box::new(node2)) };
    let head = Some(Box::new(node1));
    println!("{}", find_middle(&head));
}
medium
A. 2
B. Runtime error
C. 3
D. 1

Solution

  1. Step 1: Trace slow and fast pointers through the list

    Initially, slow and fast point to node with value 1. After first loop iteration, slow moves to node 2, fast moves to node 3.
  2. Step 2: Check loop condition and final slow pointer value

    Fast's next is None after moving, so loop stops. Slow points to node with value 2, which is the middle.
  3. Final Answer:

    2 -> Option A
  4. Quick Check:

    Middle element = 2 [OK]
Hint: Move fast pointer twice, slow pointer once until fast ends [OK]
Common Mistakes:
  • Returning fast pointer value instead of slow
  • Not checking fast.next before accessing
  • Confusing Option and Box unwraps
4. Identify the bug in this Rust function that tries to find the middle element of a linked list:
fn find_middle(head: &Option) -> i32 {
    let mut slow = head;
    let mut fast = head;
    while fast.is_some() && fast.as_ref().unwrap().next.is_some() {
        slow = &slow.as_ref().unwrap().next;
        fast = &fast.as_ref().unwrap().next;
    }
    slow.as_ref().unwrap().value
}
medium
A. fast pointer moves only one step instead of two
B. slow pointer moves two steps instead of one
C. Missing unwrap on slow pointer
D. Loop condition is incorrect

Solution

  1. Step 1: Analyze pointer movements inside the loop

    Slow pointer moves one step correctly, but fast pointer moves only one step instead of two.
  2. Step 2: Understand impact on finding middle

    Fast pointer must move two steps to reach end faster; moving one step breaks the logic.
  3. Final Answer:

    fast pointer moves only one step instead of two -> Option A
  4. Quick Check:

    Fast pointer must move two steps [OK]
Hint: Fast pointer must jump two nodes each loop [OK]
Common Mistakes:
  • Moving fast pointer only one step
  • Not checking fast.next before accessing
  • Confusing slow and fast pointer updates
5. Given a singly linked list with an even number of nodes, how can you modify the two-pointer approach in Rust to return the second middle element?
hard
A. Use a counter to count nodes and return node at count/2
B. Move slow pointer two steps and fast pointer one step in the loop
C. Stop the loop when fast.next.next is None and return slow pointer value
D. Change the loop condition to continue while fast and fast.next are not None, moving fast two steps and slow one step

Solution

  1. Step 1: Understand default behavior for even nodes

    Default two-pointer returns first middle when list length is even.
  2. Step 2: Modify loop to continue while fast and fast.next exist

    By continuing loop while fast and fast.next are Some, slow moves to second middle when fast reaches end.
  3. Final Answer:

    Change the loop condition to continue while fast and fast.next are not None, moving fast two steps and slow one step -> Option D
  4. Quick Check:

    Loop condition controls which middle is returned [OK]
Hint: Adjust loop condition to get second middle in even list [OK]
Common Mistakes:
  • Swapping slow and fast pointer speeds
  • Stopping loop too early
  • Using counting instead of two-pointer method
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