*mut 裸指针
#![allow(warnings)]
#![allow(unused)]
fn main() {
let mut t = List::<i32>::new();
t.push(1).push(2).push(3).append(4).append(5);
println!("{:?}",t);
}
#[derive(Debug)]
struct Node<T> {
element: T,
next: Option<Box<Node<T>>>,
}
#[derive(Debug)]
struct List<T> {
head: Option<Box<Node<T>>>,
tail: *mut Node<T>, // 裸指针,空链表时为 null
}
impl<T> List<T> {
fn new() -> Self {
List { head: None, tail: std::ptr::null_mut() }
}
fn push(&mut self, data: T) -> &mut Self {
let mut node = Box::new(Node {element: data,next: self.head.take()});
if self.head.is_none() {
self.tail = &mut *node;
}
self.head = Some(node);
self
}
fn append(&mut self, data: T) -> &mut Self {
let mut node = Box::new(Node { element: data, next: None });
let node_ptr: *mut Node<T> = &mut *node;
if self.head.is_none() {//原链表为空
self.head = Some(node);
} else {
unsafe { (*self.tail).next = Some(node); } //挂到最后一个节点后面
}
self.tail = node_ptr;//更新尾指针
self
}
}
NonNull 类型
#[derive(Debug)]
struct Node<T> {
element: T,
next: Option<Box<Node<T>>>,
}
#[derive(Debug)]
struct List<T> {
head: Option<Box<Node<T>>>,
tail: Option<NonNull<Node<T>>>,
}
impl<T> List<T> {
fn new() -> Self {
List { head: None, tail: None }
}
fn push(&mut self, data: T) -> &mut Self {
let mut node = Box::new(Node {element: data,next: self.head.take()});
if self.tail.is_none() {
self.tail = Some(NonNull::from(&mut *node));
}
self.head = Some(node);
self
}
fn append(&mut self, data: T) -> &mut Self {
let mut node = Box::new(Node { element: data, next: None });
let new_tail = NonNull::from(&mut *node);
if self.head.is_none() {//原链表为空
self.head = Some(node);
} else {
unsafe {self.tail.unwrap().as_mut().next = Some(node);} //挂到最后一个节点后面
}
self.tail = Some(new_tail);//更新尾指针
self
}
}
浙公网安备 33010602011771号