Bird
Raised Fist0
DSA Rustprogramming~10 mins

Find Middle Element of Linked List in DSA Rust - Interactive Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to create a new node with the given value.

DSA Rust
struct Node {
    value: i32,
    next: Option<Box<Node>>,
}

impl Node {
    fn new(val: i32) -> Self {
        Node {
            value: val,
            next: [1],
        }
    }
}
Drag options to blanks, or click blank then click option'
ASome(Box::new(Node { value: val, next: None }))
BSome(0)
CBox::new(Node { value: val, next: None })
DNone
Attempts:
3 left
💡 Hint
Common Mistakes
Using Some(0) instead of None
Trying to create a new node inside new() which causes recursion
2fill in blank
medium

Complete the code to move the slow pointer one step forward in the linked list.

DSA Rust
fn move_slow(slow: &Option<Box<Node>>) -> Option<&Box<Node>> {
    slow.as_ref().and_then(|node| [1])
}
Drag options to blanks, or click blank then click option'
Anode.next.as_ref()
Bnode.next.clone()
CSome(node.next)
Dnode.next
Attempts:
3 left
💡 Hint
Common Mistakes
Using clone() which copies the node instead of referencing
Returning Some(node.next) which is invalid because next is an Option
3fill in blank
hard

Fix the error in the loop condition to move the fast pointer two steps ahead safely.

DSA Rust
while fast.is_some() && fast.as_ref().unwrap().next.[1]() {
    fast = fast.as_ref().unwrap().next.as_ref().unwrap().next.as_ref();
    slow = slow.as_ref().unwrap().next.as_ref();
}
Drag options to blanks, or click blank then click option'
Ais_none
Bunwrap
Cis_some
Dclone
Attempts:
3 left
💡 Hint
Common Mistakes
Using is_none() which breaks the loop too early
Calling unwrap() in the condition causing panic
4fill in blank
hard

Fill both blanks to correctly update slow and fast pointers inside the loop.

DSA Rust
slow = slow.as_ref().unwrap().next.[1]();
fast = fast.as_ref().unwrap().next.as_ref().unwrap().next.[2]();
Drag options to blanks, or click blank then click option'
Aas_ref
Bclone
Cunwrap
Dis_some
Attempts:
3 left
💡 Hint
Common Mistakes
Using unwrap() which can panic if Option is None
Using clone() which copies nodes unnecessarily
5fill in blank
hard

Fill all three blanks to return the middle node's value safely.

DSA Rust
fn find_middle(head: &Option<Box<Node>>) -> Option<i32> {
    let mut slow = head.as_ref();
    let mut fast = head.as_ref();
    while fast.is_some() && fast.as_ref().unwrap().next.[1]() {
        slow = slow.unwrap().next.[2]();
        fast = fast.unwrap().next.as_ref().unwrap().next.[3]();
    }
    slow.map(|node| node.value)
}
Drag options to blanks, or click blank then click option'
Aas_ref
Bclone
Cunwrap
Dis_some
Attempts:
3 left
💡 Hint
Common Mistakes
Using unwrap() in the loop condition causing panic
Using clone() which copies nodes unnecessarily

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