我最近一直在尝试自学一些 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可以使用该类型或其他类型?
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 的基本概念领域做一些更多的研究,尤其是:
| 归档时间: |
|
| 查看次数: |
5658 次 |
| 最近记录: |