What is the main idea behind reversing a singly linked list iteratively?
We change the direction of each node's pointer one by one, so the list points backward instead of forward.
Click to reveal answer
beginner
In the iterative reversal of a singly linked list, what role does the 'previous' pointer play?
It keeps track of the node that should come before the current node once the link is reversed.
Click to reveal answer
beginner
Why do we need a 'next' pointer during the iterative reversal process?
To remember the next node before changing the current node's pointer, so we don't lose access to the rest of the list.
Click to reveal answer
beginner
What is the time complexity of reversing a singly linked list iteratively?
O(n), where n is the number of nodes, because we visit each node exactly once.
Click to reveal answer
intermediate
Show the Rust code snippet to reverse a singly linked list iteratively.
```rust
fn reverse_list(mut head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
let mut prev = None;
while let Some(mut current) = head {
head = current.next.take();
current.next = prev;
prev = Some(current);
}
prev
}
```
Click to reveal answer
What does the 'prev' pointer represent during iterative reversal of a singly linked list?
AThe tail of the original list
BThe next node to process
CThe head of the original list
DThe node after the current node after reversal
✗ Incorrect
The 'prev' pointer always points to the node that will come before the current node after reversal.
Why do we use 'current.next.take()' in Rust when reversing a linked list?
ATo move ownership of the next node out safely
BTo clone the next node
CTo delete the next node
DTo borrow the next node immutably
✗ Incorrect
In Rust, 'take()' moves the ownership out, allowing us to safely change pointers without borrowing conflicts.
What happens to the original head pointer after the iterative reversal completes?
AIt becomes None
BIt points to the new head (original tail)
CIt points to the middle node
DIt remains unchanged
✗ Incorrect
During reversal, the original head pointer moves through the list and ends as None when the list is fully reversed.
What is the space complexity of reversing a singly linked list iteratively?
AO(log n)
BO(n)
CO(1)
DO(n^2)
✗ Incorrect
The iterative reversal uses only a few pointers, so it uses constant extra space.
Which of these is NOT needed to reverse a singly linked list iteratively?
AA pointer to the previous node
BA stack to store nodes
CA pointer to the next node
DA pointer to the current node
✗ Incorrect
A stack is not needed; the reversal is done by changing pointers directly.
Explain step-by-step how to reverse a singly linked list using iteration.
Think about how you change the direction of each link one by one.
You got /6 concepts.
Write the Rust function signature and describe the key steps inside the function to reverse a singly linked list iteratively.
Focus on ownership and pointer changes in Rust.
You got /6 concepts.
Practice
(1/5)
1. What is the main purpose of reversing a singly linked list iteratively?
easy
A. To change the direction of the links so the last node becomes the first
B. To sort the linked list in ascending order
C. To remove duplicate nodes from the list
D. To find the middle node of the list
Solution
Step 1: Understand the linked list structure
A singly linked list has nodes pointing only to the next node, so reversing means changing these pointers.
Step 2: Identify the effect of reversal
Reversing changes the direction so the last node points to null and becomes the new head.
Final Answer:
To change the direction of the links so the last node becomes the first -> Option A
Quick Check:
Reversing = changing link directions [OK]
Hint: Reversing flips links, last node becomes first [OK]
Common Mistakes:
Confusing reversal with sorting
Thinking reversal removes nodes
Assuming reversal finds middle node
2. Which of the following Rust code snippets correctly initializes a mutable pointer for reversing a singly linked list iteratively?
easy
A. let mut prev = Some(Node::new());
B. let prev = Some(Node::new());
C. let mut prev = None;
D. let prev = None;
Solution
Step 1: Understand pointer initialization for reversal
We start with a previous pointer set to None because initially no nodes are reversed.
Step 2: Check mutability and value
We need mutable prev to update it during iteration, so 'let mut prev = None;' is correct.
Final Answer:
let mut prev = None; -> Option C
Quick Check:
Mutable prev starts as None [OK]
Hint: Start prev as mutable None to track reversed list [OK]
Common Mistakes:
Forgetting mut keyword
Initializing prev with a new node incorrectly
Using immutable prev when mutation is needed
3. Given the following Rust code snippet for reversing a singly linked list iteratively, what will be the printed output after reversal?
struct Node {
val: i32,
next: Option,
}
fn print_list(head: &Option) {
let mut current = head;
while let Some(node) = current {
print!("{} -> ", node.val);
current = &node.next;
}
println!("null");
}
fn reverse_list(mut head: Option) -> Option {
let mut prev = None;
while let Some(mut current) = head {
head = current.next.take();
current.next = prev;
prev = Some(current);
}
prev
}
fn main() {
let node3 = Node { val: 3, next: None };
let node2 = Node { val: 2, next: Some(Box::new(node3)) };
let node1 = Node { val: 1, next: Some(Box::new(node2)) };
let head = Some(Box::new(node1));
let reversed_head = reverse_list(head);
print_list(&reversed_head);
}
medium
A. null
B. 1 -> 2 -> 3 -> null
C. Compilation error
D. 3 -> 2 -> 1 -> null
Solution
Step 1: Trace the reversal process
The list starts as 1 -> 2 -> 3 -> null. The reversal changes links so the last node (3) becomes head.
Step 2: Confirm print output after reversal
After reversal, print_list prints nodes from new head: 3 -> 2 -> 1 -> null.
Final Answer:
3 -> 2 -> 1 -> null -> Option D
Quick Check:
Reversed list prints in reverse order [OK]
Hint: Reversed list prints nodes in reverse order [OK]
Common Mistakes:
Assuming list prints original order after reversal
Confusing Option C null with empty list
Thinking code causes compilation error
4. Identify the error in the following Rust code snippet for reversing a singly linked list iteratively:
fn reverse_list(mut head: Option) -> Option {
let mut prev = None;
while let Some(current) = head {
head = current.next;
current.next = prev;
prev = Some(current);
}
prev
}
medium
A. prev should be immutable
B. Missing .take() when assigning head = current.next
C. Loop condition should be while head.is_some()
D. Function should return head instead of prev
Solution
Step 1: Understand ownership in Rust linked list
current.next is an Option, but to move it out, .take() is needed to avoid borrowing errors.
Step 2: Identify the error in head assignment
head = current.next; tries to move without .take(), causing ownership error. Correct is head = current.next.take();
Final Answer:
Missing .take() when assigning head = current.next -> Option B
Quick Check:
Use .take() to move ownership safely [OK]
Hint: Use .take() to move Option ownership in Rust [OK]
Common Mistakes:
Ignoring Rust ownership rules
Making prev immutable by mistake
Changing loop condition unnecessarily
5. You have a singly linked list with nodes containing integer values. You want to reverse the list iteratively and then remove all nodes with even values from the reversed list. Which approach correctly combines these two operations in Rust?
hard
A. First reverse the list iteratively, then iterate over reversed list to filter out even nodes by rebuilding a new list
B. Filter out even nodes first, then reverse the filtered list recursively
C. Reverse the list recursively and remove even nodes during reversal by skipping them
D. Use a stack to push all nodes, pop them to reverse, and skip even nodes while popping
Solution
Step 1: Reverse the list iteratively
Use the iterative reversal method to get the reversed list with all nodes.
Step 2: Filter out even nodes from reversed list
Iterate over reversed list and build a new list skipping nodes with even values.
Final Answer:
First reverse the list iteratively, then iterate over reversed list to filter out even nodes by rebuilding a new list -> Option A
Quick Check:
Reverse then filter by rebuilding list [OK]
Hint: Reverse first, then filter by rebuilding list [OK]
Common Mistakes:
Trying to filter during reversal causing complexity
Using recursion when iterative is required
Using stack unnecessarily increasing space
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.