rust
/// A simple singly-linked list in Rust
use std::fmt;
#[derive(Debug)]
struct Node<T> {
value: T,
next: Option<Box<Node<T>>>,
}
#[derive(Debug)]
struct LinkedList<T> {
head: Option<Box<Node<T>>>,
len: usize,
}
impl<T: fmt::Display> LinkedList<T> {
fn new() -> Self {
LinkedList { head: None, len: 0 }
}
fn push(&mut self, value: T) {
let new_node = Box::new(Node {
value,
next: self.head.take(),
});
self.head = Some(new_node);
self.len += 1;
}
fn pop(&mut self) -> Option<T> {
self.head.take().map(|node| {
self.head = node.next;
self.len -= 1;
node.value
})
}
fn iter(&self) -> impl Iterator<Item = &T> {
let mut current = &self.head;
std::iter::from_fn(move || {
current.as_ref().map(|node| {
current = &node.next;
&node.value
})
})
}
}
impl<T: fmt::Display> fmt::Display for LinkedList<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let items: Vec<String> = self.iter().map(|v| v.to_string()).collect();
write!(f, "[{}]", items.join(" -> "))
}
}
fn main() {
let mut list = LinkedList::new();
for i in 1..=5 {
list.push(i);
}
println!("List: {}", list);
println!("Popped: {:?}", list.pop());
println!("List: {}", list);
}