A linked list is a chain of nodes where each node holds data and a link to the next node. It is like a treasure hunt where each clue leads to the next one.
Click to reveal answer
beginner
How do you search for a value in a linked list?
Start at the first node and check its value. If it matches, stop. If not, move to the next node. Repeat until you find the value or reach the end.
Click to reveal answer
intermediate
What is the time complexity of searching a linked list?
The time complexity is O(n), where n is the number of nodes. You might have to check each node once in the worst case.
Click to reveal answer
intermediate
Why can't we do faster search like binary search on a linked list?
Because linked lists do not allow direct access to the middle element. You must follow links one by one, unlike arrays where you can jump to any index.
Click to reveal answer
beginner
Show a simple Rust function to search a value in a singly linked list.
```rust
struct Node {
data: i32,
next: Option<Box<Node>>,
}
fn search(head: &Option<Box<Node>>, target: i32) -> bool {
let mut current = head;
while let Some(node) = current {
if node.data == target {
return true;
}
current = &node.next;
}
false
}
```
Click to reveal answer
What does each node in a linked list contain?
AOnly a link to the next node
BOnly data
CData and a link to the next node
DData and a link to the previous node only
✗ Incorrect
Each node holds data and a link to the next node, forming the chain.
What is the first step when searching for a value in a linked list?
ACheck the last node
BJump to the middle node
CSort the list first
DCheck the first node
✗ Incorrect
You start searching from the first node and move forward.
What happens if the value is not found in the linked list?
AReturn true
BReturn false after checking all nodes
CThrow an error
DRestart the search
✗ Incorrect
If the value is not found after checking all nodes, return false.
Why is binary search not suitable for linked lists?
ABecause linked lists do not allow direct access to middle elements
BBecause linked lists are always sorted
CBecause linked lists have no data
DBecause linked lists are faster than arrays
✗ Incorrect
Linked lists require sequential access, so you cannot jump to the middle element directly.
What is the worst-case time complexity to search a linked list with n nodes?
AO(n)
BO(log n)
CO(n log n)
DO(1)
✗ Incorrect
You may need to check every node once, so the time complexity is O(n).
Explain how to search for a value in a singly linked list step-by-step.
Think of walking through a chain checking each link.
You got /4 concepts.
Write a simple Rust function to search for an integer value in a singly linked list and explain how it works.
Use Option<Box<Node>> and while let syntax.
You got /4 concepts.
Practice
(1/5)
1. What is the main purpose of searching for a value in a linked list?
easy
A. To find if a specific value exists in the list
B. To add a new node at the end of the list
C. To delete the first node of the list
D. To reverse the order of nodes in the list
Solution
Step 1: Understand the search operation
Searching in a linked list means checking each node to see if it contains the value we want.
Step 2: Identify the goal of searching
The goal is to find whether the value exists anywhere in the list, not to modify the list.
Final Answer:
To find if a specific value exists in the list -> Option A
Quick Check:
Search means find value [OK]
Hint: Search means check each node for the value [OK]
Common Mistakes:
Confusing search with insertion or deletion
Thinking search changes the list
Assuming search reverses the list
2. Which Rust code snippet correctly starts a search for a value in a linked list node called head?
easy
A. let current = head.as_mut();
B. let current = head.unwrap();
C. let mut current = head.unwrap();
D. let mut current = head.as_ref();
Solution
Step 1: Understand linked list node type in Rust
Linked list nodes are often wrapped in Option and Box, so head is Option.
Step 2: Choose safe way to start traversal
Using head.as_ref() gives an Option reference to the node without moving ownership, allowing safe traversal.
Final Answer:
let mut current = head.as_ref(); -> Option D
Quick Check:
Use as_ref() to borrow node safely [OK]
Hint: Use as_ref() to get a reference without moving ownership [OK]
Common Mistakes:
Using unwrap() which can panic if list is empty
Using as_mut() when only reading values
Not using mut when needing to traverse
3. What will be the output of this Rust code searching for value 5 in the linked list 1 -> 3 -> 5 -> 7?
struct Node {
value: i32,
next: Option,
}
fn search(head: &Option, target: i32) -> bool {
let mut current = head.as_ref();
while let Some(node) = current {
if node.value == target {
return true;
}
current = node.next.as_ref();
}
false
}
fn main() {
let list = Some(Box::new(Node { value: 1, next: Some(Box::new(Node { value: 3, next: Some(Box::new(Node { value: 5, next: Some(Box::new(Node { value: 7, next: None })) })) })) }));
println!("{}", search(&list, 5));
}
medium
A. false
B. true
C. Compilation error
D. Runtime panic
Solution
Step 1: Trace the search function
The function starts at head (value 1), checks 1 != 5, moves to 3, checks 3 != 5, moves to 5, finds 5 == 5, returns true.
Step 2: Confirm output of main
Main prints the boolean returned by search, which is true.
Final Answer:
true -> Option B
Quick Check:
Value found in list = true [OK]
Hint: Follow nodes until value matches or list ends [OK]
Common Mistakes:
Assuming search returns false without checking all nodes
Confusing Option types causing compile errors
Forgetting to use as_ref() when traversing
4. Identify the bug in this Rust function that searches for a value in a linked list:
fn search(head: &Option, target: i32) -> bool {
let mut current = head.unwrap();
while current.is_some() {
if current.value == target {
return true;
}
current = current.next.unwrap();
}
false
}
medium
A. Incorrect comparison operator used
B. Missing mut keyword for current variable
C. Using unwrap() on Option without checking can cause panic
D. Function does not return a boolean
Solution
Step 1: Analyze unwrap() usage
Calling unwrap() on Option without checking if it is Some can cause the program to panic if the list is empty or next is None.
Step 2: Explain safe alternative
Using as_ref() and pattern matching with while let Some(node) = current avoids panics by safely handling None cases.
Final Answer:
Using unwrap() on Option without checking can cause panic -> Option C
Quick Check:
Unsafe unwrap causes panic [OK]
Hint: Never unwrap Option without checking Some first [OK]
Common Mistakes:
Ignoring possibility of None causing panic
Not using while let for safe traversal
Assuming unwrap always safe
5. Given a linked list where each node contains an integer, how would you modify the search function to return the position (0-based index) of the first occurrence of a target value, or -1 if not found? Choose the correct Rust code snippet.
struct Node {
value: i32,
next: Option,
}
fn search_position(head: &Option, target: i32) -> i32 {
// Fill in the code
}
hard
A. let mut current = head.as_ref(); let mut index = 0; while let Some(node) = current { if node.value == target { return index; } current = node.next.as_ref(); index += 1; } -1
B. let mut current = head.unwrap(); let mut index = 0; while current.is_some() { if current.value == target { return index; } current = current.next.unwrap(); index += 1; } -1
C. let mut current = head.as_ref(); let mut index = 1; while let Some(node) = current { if node.value == target { return index; } current = node.next.as_ref(); index += 1; } 0
D. let mut current = head.as_ref(); let mut index = 0; while let Some(node) = current { if node.value != target { return index; } current = node.next.as_ref(); index += 1; } -1
Solution
Step 1: Initialize traversal and index
Start with current as a reference to head and index at 0 to count positions from start.
Step 2: Traverse nodes checking values
Use while let Some(node) to safely traverse. If node.value equals target, return current index. Otherwise, move to next node and increment index.
Step 3: Return -1 if not found
If loop ends without finding target, return -1 to indicate absence.
Final Answer:
let mut current = head.as_ref(); let mut index = 0; while let Some(node) = current { if node.value == target { return index; } current = node.next.as_ref(); index += 1; } -1 -> Option A
Quick Check:
Return index if found, else -1 [OK]
Hint: Return index on match, else -1 after full traversal [OK]
Common Mistakes:
Starting index at 1 instead of 0
Returning index when value does not match
Using unwrap() causing panic on empty list
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.