RUST 实现单链表的头插和尾插
记录自己的学习 给自己的备份
// 节点
#[derive(Debug)]
struct Node<T> {
val:T,
next:Option<Box<Node<T>>>,
}
#[derive(Debug)]
struct LinkedList<T> {
size:u32,
header:Option<Box<Node<T>>>,
}
impl<T> LinkedList<T> {
pub fn new() -> Option<Self>{
Some(LinkedList {
size:0,
header:None
})
}
pub fn is_empty(&self) -> bool {
self.size == 0
}
pub fn len(&self) -> u32 {
self.size
}
pub fn push_header(&mut self, value:T){
let next = Node {
val: value,
next: self.header.take(),
};
self.header = Some(Box::new(next));
self.size+=1;
}
fn remove_header(&mut self){
self.header = self.header.take().unwrap().next;
self.size-=1;
}
fn push(&mut self, value: T) {
let new_node = Node{
val: value,
next: None,
};
match self.header.as_mut() {
None => self.header = Some(Box::new(new_node)),
Some(mut node) => {
while node.next.is_some() {
node = node.next.as_mut().unwrap();
}
node.next = Some(Box::new(new_node));
}
}
self.size+=1;
}
fn pop(&mut self) -> Option<T>{
match self.header.as_mut() {
None => None,
Some(mut node) => {
while node.next.is_some() && node.next.as_ref().unwrap().next.is_some() {
node = node.next.as_mut().unwrap();
}
self.size-=1;
match node.next {
Some(_) => Some(node.next.take().unwrap().val),
None => Some(self.header.take().unwrap().val),
}
}
}
}
}
fn main() {
let mut list = LinkedList::new().unwrap();
// list.push_header(20);
// list.push_header(30);
// println!("SIZE:::::::::; {:?}",list);
list.push(10);
// println!("SIZE:::::::::; {:?}",list);
list.push(20);
// println!("SIZE:::::::::; {:?}",list);
list.push(30);
// println!("SIZE:::::::::; {:?}",list);
list.push(40);
// println!("SIZE:::::::::; {:?}",list);
list.remove_header();
let data = list.pop();
println!("pop; {:?}",data);
println!("list.push(20); {:?}",list);
}