🦀/100 Projects/Notes/Source

src/main.rs

View on GitHub
use std::fmt;
 
// Node struct representing each element
struct Node {
    value: i32,
    next: Option<Box<Node>>,
}
 
// Linked list with a head pointer
struct LinkedList {
    head: Option<Box<Node>>,
}
 
impl LinkedList {
    fn new() -> Self {
        LinkedList { head: None }
    }
 
    fn push_front(&mut self, val: i32) {
        let new_node = Box::new(Node {
            value: val,
            next: self.head.take(),
        });
        self.head = Some(new_node);
    }
 
    fn push_back(&mut self, val: i32) {
        let mut current = &mut self.head;
        while let Some(node) = current {
            current = &mut node.next;
        }
        *current = Some(Box::new(Node { value: val, next: None }));
    }

    fn delete(&mut self, val: i32) -> bool {
        let mut current = &mut self.head;
        loop {
            match current {
                None => return false,
                Some(node) if node.value == val => {
                    *current = node.next.take();
                    return true;
                }
                Some(node) => {
                    current = &mut node.next;
                }
            }
        }
    }
 
    fn contains(&self, val: i32) -> bool {
        let mut current = &self.head;
        while let Some(node) = current {
            if node.value == val {
                return true;
            }
            current = &node.next;
        }
        false
    }
 
    fn print(&self) {
        let mut current = &self.head;
        print!("List: ");
        while let Some(node) = current {
            print!("{} -> ", node.value);
            current = &node.next;
        }
        println!("None");
    }
}
 
// Optional display trait for prettier output
impl fmt::Display for LinkedList {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        let mut current = &self.head;
        while let Some(node) = current {
            write!(f, "{} -> ", node.value)?;
            current = &node.next;
        }
        write!(f, "None")
    }
}
 
fn main() {
    let mut list = LinkedList::new();
    list.push_front(10);
    list.push_back(20);
    list.push_back(30);
    list.print(); // List: 10 -> 20 -> 30 -> None
 
    println!("Contains 20? {}", list.contains(20));
    println!("Deleting 20...");
    list.delete(20);
    list.print(); // List: 10 -> 30 -> None
}

← Back to folder