Bird
Raised Fist0
DSA Rustprogramming~10 mins

Why Linked List Exists and What Problem It Solves in DSA Rust - Test Your Knowledge

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 in a linked list.

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

impl Node {
    fn new(value: i32) -> Self {
        Node {
            value: value,
            next: [1],
        }
    }
}
Drag options to blanks, or click blank then click option'
AOption::new(value)
BSome(value)
CNone
DBox::new(value)
Attempts:
3 left
💡 Hint
Common Mistakes
Using Some(value) instead of None for the next pointer.
Trying to box the value instead of the next node.
2fill in blank
medium

Complete the code to add a new node at the beginning of the linked list.

DSA Rust
fn prepend(head: Option<Box<Node>>, value: i32) -> Option<Box<Node>> {
    Some(Box::new(Node {
        value: value,
        next: [1],
    }))
}
Drag options to blanks, or click blank then click option'
Ahead
BSome(head)
Chead.next
DNone
Attempts:
3 left
💡 Hint
Common Mistakes
Using head.next which is invalid because head is an Option.
Using None which would lose the rest of the list.
3fill in blank
hard

Fix the error in the code to traverse and print all values in the linked list.

DSA Rust
fn print_list(mut head: &Option<Box<Node>>) {
    while let Some(node) = [1] {
        println!("{}", node.value);
        head = &node.next;
    }
}
Drag options to blanks, or click blank then click option'
Ahead.next
Bhead.as_ref()
Chead
Dhead.unwrap()
Attempts:
3 left
💡 Hint
Common Mistakes
Using head.next which does not exist on Option.
Using unwrap() which consumes the Option and causes errors.
4fill in blank
hard

Fill both blanks to create a linked list with values 1, 2, 3 in order.

DSA Rust
let mut list = [1];
list = prepend(list, 3);
list = prepend(list, [2]);
list = prepend(list, 1);
Drag options to blanks, or click blank then click option'
ANone
B3
C2
DSome(Box::new(Node::new(1)))
Attempts:
3 left
💡 Hint
Common Mistakes
Starting with Some(Box::new(Node::new(1))) which duplicates the first node.
Prepending values in wrong order.
5fill in blank
hard

Fill all three blanks to create a function that counts nodes in the linked list.

DSA Rust
fn count_nodes(mut head: &Option<Box<Node>>) -> i32 {
    let mut count = 0;
    while let Some(node) = [1] {
        count += [2];
        head = &[3];
    }
    count
}
Drag options to blanks, or click blank then click option'
Ahead.as_ref()
B1
Cnode.next
Dhead.unwrap()
Attempts:
3 left
💡 Hint
Common Mistakes
Using unwrap() which consumes the Option.
Incrementing count by wrong values.
Not advancing head correctly.

Practice

(1/5)
1. Why do we use a linked list instead of an array in some cases?
easy
A. Because linked lists store elements in contiguous memory locations
B. Because linked lists use less memory than arrays always
C. Because linked lists allow easy insertion and deletion without shifting elements
D. Because linked lists are faster for accessing elements by index

Solution

  1. Step 1: Understand array limitations and linked list advantages

    Arrays store elements in contiguous memory, so inserting or deleting in the middle requires shifting elements, which is slow. Linked lists store elements as nodes linked by pointers, so insertion and deletion can be done by changing pointers without shifting.
  2. Final Answer:

    Because linked lists allow easy insertion and deletion without shifting elements -> Option C
  3. Quick Check:

    Linked list insertion/deletion ease [OK]
Hint: Linked lists excel at insert/delete without shifting [OK]
Common Mistakes:
  • Thinking linked lists use less memory always
  • Believing linked lists store elements contiguously
  • Assuming linked lists are faster for index access
2. Which of the following is the correct way to define a node struct for a singly linked list in Rust?
easy
A. struct Node { value: i32, next: Box<Node> }
B. struct Node { value: i32, next: Option }
C. struct Node { value: i32, next: &Node }
D. struct Node { value: i32, next: Node }

Solution

  1. Step 1: Recall Rust ownership rules and Option usage

    Rust requires recursive types like linked lists to use indirection like Box to allocate on heap. The next pointer can be None if it's the last node, so Option is needed.
  2. Final Answer:

    struct Node { value: i32, next: Option } -> Option B
  3. Quick Check:

    Use Option for next pointer [OK]
Hint: Use Option for next pointer in Rust linked list [OK]
Common Mistakes:
  • Using next: Node causes infinite size error
  • Using references (&Node) without lifetime causes errors
  • Omitting Option causes no way to mark list end
3. What will be the output of the following Rust code that creates a linked list with values 1, 2, 3 and prints them?
struct Node {
    value: i32,
    next: Option,
}

fn main() {
    let third = Node { value: 3, next: None };
    let second = Node { value: 2, next: Some(Box::new(third)) };
    let first = Node { value: 1, next: Some(Box::new(second)) };

    let mut current = &first;
    while let Some(ref next_node) = current.next {
        println!("{} ->", current.value);
        current = next_node;
    }
    println!("{} -> null", current.value);
}
medium
A. 1 -> 2 -> 3 -> null
B. 3 -> 2 -> 1 -> null
C. 1 -> 2 -> null
D. Compilation error due to ownership

Solution

  1. Step 1: Trace linked list creation and printing loop

    Nodes are created in reverse order: third (3), second (2), first (1) linking to next. Loop prints current.value then moves to next node until next is None, printing 1, 2, 3 in order.
  2. Final Answer:

    1 -> 2 -> 3 -> null -> Option A
  3. Quick Check:

    Print order matches linked list order [OK]
Hint: Follow next pointers to print nodes in order [OK]
Common Mistakes:
  • Confusing order and printing reversed
  • Expecting compilation error due to ownership
  • Stopping loop too early missing last node
4. The following Rust code tries to insert a new node with value 4 at the beginning of a linked list but causes a compilation error. What is the error?
struct Node {
    value: i32,
    next: Option,
}

fn main() {
    let mut first = Node { value: 1, next: None };
    let new_node = Node { value: 4, next: Some(Box::new(first)) };
    first = new_node;
}
medium
A. Borrow of moved value `first`
B. Cannot assign to `first` because it is not mutable
C. Recursive type has infinite size without Box
D. No error, code compiles fine

Solution

  1. Step 1: Identify actual error

    `first` is declared mutable, so assignment should be allowed and Cannot assign to `first` because it is not mutable is incorrect. The error is `first` is moved into `Box::new(first)` when creating `new_node`, but then `first = new_node` tries to use `first` after the move, causing borrow of moved value.
  2. Final Answer:

    Borrow of moved value `first` -> Option A
  3. Quick Check:

    Ownership move error [OK]
Hint: Check ownership moves when assigning linked nodes [OK]
Common Mistakes:
  • Confusing mutability error with ownership error
  • Thinking code compiles fine
  • Ignoring ownership rules in Rust
5. You want to implement a linked list in Rust that supports efficient insertion at the front and also allows traversing the list. Which of the following best explains why a linked list is preferred over a vector (array) for this use case?
hard
A. Linked lists store elements contiguously, making traversal faster than vectors
B. Vectors allow O(1) insertion at front but linked lists are simpler to implement
C. Vectors use pointers to link elements, so linked lists are redundant
D. Linked lists allow O(1) insertion at front without reallocating or shifting elements

Solution

  1. Step 1: Analyze insertion and traversal complexities

    Vectors require shifting elements or reallocating memory for insertion at front, which is O(n). Linked lists insert at front by changing head pointer and new node's next pointer, which is O(1) without shifting. Traversal in linked lists is sequential via pointers; vectors have contiguous memory but insertion cost is higher at front.
  2. Final Answer:

    Linked lists allow O(1) insertion at front without reallocating or shifting elements -> Option D
  3. Quick Check:

    Insertion cost at front = O(1) linked list [OK]
Hint: Linked list front insertion is O(1), vector front insertion is O(n) [OK]
Common Mistakes:
  • Thinking vectors insert at front in O(1)
  • Believing linked lists store elements contiguously
  • Confusing pointers in vectors with linked list nodes
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