Rust 中的单链表

Oli*_*ver 5 linked-list rust

我最近一直在尝试自学一些 Rust,并想通过实现一个简单的链表来练习一下。我从 Rust 库的链表中获得了一些灵感,并尝试复制我已经理解的部分。此外,我决定暂时将其设为单链接。

struct Node<T> {
    element: T,
    next: Option<Box<Node<T>>>,
}

impl<T> Node<T> {
    fn new(element: T) -> Self {
        Node {
            element: element,
            next: None,
        }
    }

    fn append(&mut self, element: Box<Node<T>>) {
        self.next = Some(element);
    }
}

pub struct LinkedList<T> {
    head: Option<Box<Node<T>>>,
    tail: Option<Box<Node<T>>>,
    len: u32,
}

impl<T> LinkedList<T> {
    pub fn new() -> Self {
        head: None,
        tail: None,
        len: 0,
    }

    pub fn push(&mut self, element: T) {
        let node: Box<Node<T>> = Box::new(Node::new(element));

        match self.tail {
            None => self.head = Some(node),
            Some(mut ref tail) => tail.append(node),
        }
        self.tail = Some(node);
        self.len += 1;
    }

    pub fn pop(&mut self) -> Option<T> {
        //not implemented
    }

    pub fn get(&self, index: u32) -> Option<T> {
        //not implemented
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所得到的;据我了解,这段代码的问题是Box不能有多个引用,以保持内存安全。

所以当我将列表头设置为节点时

None => self.head = Some(node),
Run Code Online (Sandbox Code Playgroud)

我不能然后继续设置

self.tail = Some(node);
Run Code Online (Sandbox Code Playgroud)

后来,到目前为止,我的理解是否正确?这样做的正确方法是什么?我必须Shared在图书馆中使用like 还是有一种方法Box可以使用该类型或其他类型?

lje*_*drz 4

node您的问题是您在移动值 ( ) 后尝试使用它;当您在表达式中使用 , 时,sinceBox<Node<T>>不实现:Copymatch

match self.tail {
    None => self.head = Some(node),
    Some(ref mut tail) => tail.append(node),
}
Run Code Online (Sandbox Code Playgroud)

node被移至self.head或 且self.tail以后不能再使用。除了阅读必修的《使用太多链表学习 Rust》来了解在 Rust 中实现链表的不同方式之外,我建议你首先在 Rust 的基本概念领域做一些更多的研究,尤其是: