Bird
Raised Fist0
DSA Rustprogramming~20 mins

Find Middle Element of Linked List in DSA Rust - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Middle Element Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Find the middle element output for odd length list
What is the output of the code when finding the middle element of a linked list with 5 nodes?
DSA Rust
struct Node {
    value: i32,
    next: Option<Box<Node>>,
}

fn find_middle(head: &Option<Box<Node>>) -> 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.as_ref();
        fast = fast.as_ref().unwrap().next.as_ref().unwrap().next.as_ref();
    }
    slow.map(|node| node.value)
}

fn main() {
    let node5 = Node { value: 5, next: None };
    let node4 = Node { value: 4, next: Some(Box::new(node5)) };
    let node3 = Node { value: 3, next: Some(Box::new(node4)) };
    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).unwrap());
}
A3
B4
C2
D5
Attempts:
2 left
💡 Hint
Use two pointers: one moves one step, the other moves two steps.
❓ Predict Output
intermediate
2:00remaining
Find the middle element output for even length list
What is the output of the code when finding the middle element of a linked list with 6 nodes?
DSA Rust
struct Node {
    value: i32,
    next: Option<Box<Node>>,
}

fn find_middle(head: &Option<Box<Node>>) -> 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.as_ref();
        fast = fast.as_ref().unwrap().next.as_ref().unwrap().next.as_ref();
    }
    slow.map(|node| node.value)
}

fn main() {
    let node6 = Node { value: 6, next: None };
    let node5 = Node { value: 5, next: Some(Box::new(node6)) };
    let node4 = Node { value: 4, next: Some(Box::new(node5)) };
    let node3 = Node { value: 3, next: Some(Box::new(node4)) };
    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).unwrap());
}
A3
B4
C2
D5
Attempts:
2 left
💡 Hint
For even length, the function returns the second middle node.
🧠 Conceptual
advanced
1:30remaining
Why use two pointers to find the middle element?
Why is the two-pointer technique (slow and fast pointers) efficient for finding the middle element of a linked list?
AIt traverses the list twice, once to count nodes and once to find the middle.
BIt requires sorting the list first to find the middle element.
CIt uses extra memory to store all nodes before finding the middle.
DIt traverses the list only once, using O(n) time and O(1) space.
Attempts:
2 left
💡 Hint
Think about how many times the list is traversed and memory used.
🔧 Debug
advanced
2:00remaining
Identify the bug in this middle element finder
What error will this Rust code produce when trying to find the middle element of a linked list?
DSA Rust
fn find_middle(head: &Option<Box<Node>>) -> 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().map(|node| node.value)
}
AInfinite loop because fast pointer does not advance correctly.
BCompilation error due to missing struct definition.
CRuntime panic due to unwrap on None value.
DCorrect output with no errors.
Attempts:
2 left
💡 Hint
Check how fast pointer moves inside the loop.
🚀 Application
expert
3:00remaining
Find middle element in a circular linked list
Given a circular singly linked list where the last node points back to the head, which approach correctly finds the middle element?
AUse recursion to find the middle node by splitting the list.
BTraverse until fast reaches None, then return slow's value.
CUse slow and fast pointers; stop when fast or fast.next equals head.
DCount nodes first, then traverse half the count to find middle.
Attempts:
2 left
💡 Hint
In circular lists, there is no None; use head to detect cycle.

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