Challenge - 5 Problems
Queue Mastery Badge
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediateOutput of Enqueue and Dequeue Operations
What is the printed state of the queue after performing these operations in order: enqueue 10, enqueue 20, dequeue, enqueue 30?
DSA Rust
struct Node {
data: i32,
next: Option<Box<Node>>,
}
struct Queue {
front: Option<Box<Node>>,
rear: Option<*mut Node>,
}
impl Queue {
fn new() -> Self {
Queue { front: None, rear: None }
}
fn enqueue(&mut self, val: i32) {
let mut new_node = Box::new(Node { data: val, next: None });
let raw_node = &mut *new_node as *mut Node;
if self.rear.is_none() {
self.front = Some(new_node);
self.rear = Some(raw_node);
} else {
unsafe {
(*self.rear.unwrap()).next = Some(new_node);
}
self.rear = Some(raw_node);
}
}
fn dequeue(&mut self) -> Option<i32> {
self.front.take().map(|front_node| {
self.front = front_node.next;
if self.front.is_none() {
self.rear = None;
}
front_node.data
})
}
fn print_queue(&self) {
let mut current = self.front.as_ref();
while let Some(node) = current {
print!("{} -> ", node.data);
current = node.next.as_ref();
}
println!("null");
}
}
fn main() {
let mut q = Queue::new();
q.enqueue(10);
q.enqueue(20);
q.dequeue();
q.enqueue(30);
q.print_queue();
}Attempts:
2 left
💡 Hint
Remember that dequeue removes the front element from the queue.
✗ Incorrect
After enqueueing 10 and 20, the queue is 10 -> 20 -> null. Dequeue removes 10, so queue becomes 20 -> null. Enqueue 30 adds it to the rear, so queue is 20 -> 30 -> null.
🧠 Conceptual
intermediateUnderstanding Queue Rear Pointer
Why does the queue implementation using a linked list keep a rear pointer in addition to the front pointer?
Attempts:
2 left
💡 Hint
Think about how adding elements at the end of a linked list works.
✗ Incorrect
The rear pointer allows direct access to the last node, so enqueue operations can add new nodes in constant time without traversing the entire list.
🔧 Debug
advancedIdentify the Error in Dequeue Implementation
What error will occur when running this dequeue method if the queue is empty?
fn dequeue(&mut self) -> Option {
let front_node = self.front.take().unwrap();
self.front = front_node.next;
if self.front.is_none() {
self.rear = None;
}
Some(front_node.data)
}
Attempts:
2 left
💡 Hint
What happens if unwrap is called on None?
✗ Incorrect
Calling unwrap on None causes a panic at runtime. The dequeue method should handle the empty queue case safely.
❓ Predict Output
advancedOutput After Multiple Enqueue and Dequeue
What is the printed queue after these operations?
enqueue 5
enqueue 15
dequeue
enqueue 25
dequeue
dequeue
enqueue 35
print queue
DSA Rust
struct Node {
data: i32,
next: Option<Box<Node>>,
}
struct Queue {
front: Option<Box<Node>>,
rear: Option<*mut Node>,
}
impl Queue {
fn new() -> Self {
Queue { front: None, rear: None }
}
fn enqueue(&mut self, val: i32) {
let mut new_node = Box::new(Node { data: val, next: None });
let raw_node = &mut *new_node as *mut Node;
if self.rear.is_none() {
self.front = Some(new_node);
self.rear = Some(raw_node);
} else {
unsafe {
(*self.rear.unwrap()).next = Some(new_node);
}
self.rear = Some(raw_node);
}
}
fn dequeue(&mut self) -> Option<i32> {
self.front.take().map(|front_node| {
self.front = front_node.next;
if self.front.is_none() {
self.rear = None;
}
front_node.data
})
}
fn print_queue(&self) {
let mut current = self.front.as_ref();
while let Some(node) = current {
print!("{} -> ", node.data);
current = node.next.as_ref();
}
println!("null");
}
}
fn main() {
let mut q = Queue::new();
q.enqueue(5);
q.enqueue(15);
q.dequeue();
q.enqueue(25);
q.dequeue();
q.dequeue();
q.enqueue(35);
q.print_queue();
}Attempts:
2 left
💡 Hint
Track each enqueue and dequeue carefully to see which elements remain.
✗ Incorrect
After enqueue 5 and 15, queue is 5 -> 15 -> null. Dequeue removes 5, queue is 15 -> null. Enqueue 25, queue is 15 -> 25 -> null. Dequeue removes 15, queue is 25 -> null. Dequeue removes 25, queue is empty. Enqueue 35, queue is 35 -> null.
🧠 Conceptual
expertWhy Use Unsafe Pointer for Rear in Rust Queue?
In the Rust linked list queue implementation, why is the rear pointer stored as Option<*mut Node> (a raw mutable pointer) instead of Option> or Option<&mut Node>?
Attempts:
2 left
💡 Hint
Think about Rust's ownership and borrowing rules and how they affect linked structures.
✗ Incorrect
Box owns the node, so having two Boxes pointing to the same node would violate ownership rules. &mut references cannot be stored long-term due to borrowing rules. Using a raw pointer allows mutable access to the rear node without ownership conflicts, but requires unsafe code.
