最近私は自分自身で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
}
}
これは私がこれまでに得たものです。私が理解しているところでは、このコードの問題は、Box
がメモリの安全性を保持するために複数のリファレンスを持つことができないということです。私は
None => self.head = Some(node),
にノードへのリストの先頭に設定したときに
だから私は、その後
self.tail = Some(node);
後に先に行くと、設定することはできません、私は私の理解では、これまでに修正するのですか?これを行う正しい方法は何でしょうか?ライブラリのようにShared
を使用する必要がありますか、またはBox
または他のタイプを利用できる方法はありますか?
[必須基準(全面が多すぎリンクリストで錆を学習)](http://cglab.ca/~abeinges/blah/too-many-lists/book/) – ljedrz
なお伝統的なシングルl inked(Consリスト)は 'tail'を記憶しません。これはO(1)で追加できるようにする方法ですが、必ずしも必要ではありません。 –