Challenge 35

Rust Challenge: Simple Linked List for Task List

Implement a singly linked list for a to-do application where each task is a number (task ID).

Create the list from a range of numbers and add a method to reverse the list to process tasks in the opposite order.


#[derive(Clone)]
struct Node {
    task_id: i32,
    next: Option<Box<Node>>,
}

struct TaskList {
    head: Option<Box<Node>>,
}

impl TaskList {
    // Initialize an empty task list
    fn new() -> Self {
        unimplemented!("Create a new empty TaskList");
    }

    // Create a task list from a range of task IDs (start..=end)
    fn from_range(start: i32, end: i32) -> Self {
        unimplemented!("Implement creating a singly linked list from a range of numbers");
    }

    // Reverse the task list
    fn reverse(&mut self) {
        unimplemented!("Implement reversing the singly linked list");
    }

    // Convert the task list to a vector for testing
    fn to_vec(&self) -> Vec<i32> {
        unimplemented!("Implement converting the linked list to a vector");
    }
}

// don't touch the code in the main function below
fn main() {
    // Test 1: Create task list from range and check order
    let task_list1 = TaskList::from_range(1, 5);
    let result1 = task_list1.to_vec();
    if result1 != vec![1, 2, 3, 4, 5] {
        panic!("Test 1 failed: Expected [1, 2, 3, 4, 5], got {:?}", result1);
    }
    println!("Test 1 passed: {:?}", result1);

    // Test 2: Reverse the task list
    let mut task_list2 = TaskList::from_range(1, 5);
    task_list2.reverse();
    let result2 = task_list2.to_vec();
    if result2 != vec![5, 4, 3, 2, 1] {
        panic!("Test 2 failed: Expected [5, 4, 3, 2, 1], got {:?}", result2);
    }
    println!("Test 2 passed: {:?}", result2);
}

Solution

Click to Show/Hide Solution
#![allow(unused)]
fn main() {
#[derive(Clone)]
struct Node {
    task_id: i32,
    next: Option<Box<Node>>,
}

struct TaskList {
    head: Option<Box<Node>>,
}

impl TaskList {
    fn new() -> Self {
        TaskList { head: None }
    }

    fn from_range(start: i32, end: i32) -> Self {
        let mut task_list = TaskList::new();
        for id in (start..=end).rev() {
            let new_node = Box::new(Node {
                task_id: id,
                next: task_list.head.take(),
            });
            task_list.head = Some(new_node);
        }
        task_list
    }

    fn reverse(&mut self) {
        let mut prev = None;
        let mut current = self.head.take();
        while let Some(mut node) = current {
            let next = node.next.take();
            node.next = prev;
            prev = Some(node);
            current = next;
        }
        self.head = prev;
    }

    fn to_vec(&self) -> Vec<i32> {
        let mut result = Vec::new();
        let mut current = &self.head;
        while let Some(node) = current {
            result.push(node.task_id);
            current = &node.next;
        }
        result
    }
}
}