*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
    }
}

 

posted on 2026-10-23 12:52  Freud  阅读(6)  评论(0)    收藏  举报