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);
}