#[derive(Debug)]
pub struct Node<T> {
pub value: T,
pub next: Option<Box<Node<T>>>,
}
pub struct LinkedList<T> {
pub head: Option<Box<Node<T>>>,
}
impl<T: std::cmp::PartialEq> LinkedList<T> {
pub fn new() -> Self {
LinkedList { head: None }
}
pub fn push(&mut self, value: T) {
let new_node = Node {
value: value,
next: self.head.take(),
};
self.head = Some(Box::new(new_node));
}
pub fn pop(&mut self) -> Option<T> {
self.head.take().map(|node| {
self.head = node.next;
node.value
})
}
pub fn peek(&self) -> Option<&T> {
self.head.as_ref().map(|node| &node.value)
}
pub fn is_empty(&self) -> bool {
self.head.is_none()
}
pub fn search(&self, value: &T) -> Option<&Node<T>> {
let mut current = &self.head;
while let Some(node) = current {
if &node.value == value {
return Some(node);
}
current = &node.next;
}
None
}
}