Rust:如何实现链表?
我以为我会因为实施了一些非常简单的结构和算法而陷入困境,我从一个链表开始。事实证明,事情并不是那么简单。这是我目前的代码:Rust:如何实现链表?,rust,Rust,我以为我会因为实施了一些非常简单的结构和算法而陷入困境,我从一个链表开始。事实证明,事情并不是那么简单。这是我目前的代码: enum List<T> { Node(T, ~List<T>), Nil } impl<T> List<T> { fn new(vector: &[T]) -> List<T> { Nil } fn add(&mut self, item: T)
enum List<T>
{
Node(T, ~List<T>),
Nil
}
impl<T> List<T>
{
fn new(vector: &[T]) -> List<T> { Nil }
fn add(&mut self, item: T)
{
let tail = self;
loop
{
match *tail
{
Node(_, ~ref next) => tail = next,
Nil => break
}
}
*tail = Node(item, ~Nil);
}
}
枚举列表
{
节点(T,~List),
无
}
impl列表
{
fn新的(向量:&[T])->列表{Nil}
fn添加(&mut自我,项目:T)
{
让尾巴=自我;
环
{
匹配*尾
{
节点(551;,~ ref next)=>tail=next,
零=>中断
}
}
*尾=节点(项,~Nil);
}
}
由于不兼容的可变性,无法在match语句中将next分配给tail,因此无法编译此文件。我知道使用垃圾收集指针很容易做到这一点,但这有点违背了本练习的教育目的:我想知道如何在没有Gc或Rc指针的情况下做到这一点。看起来您试图遍历自己的列表以找到最后的元素,但实际上没有循环。假设您解决了这个问题,那么您的可变性问题可以通过使用
ref mut
而不是ref
来解决
为了亲自尝试,我使用了add()
的递归实现,它可以工作:
fn add(&mut self, item: T) {
match *self {
Node(_, ref mut next) => next.add(item),
Nil => *self = Node(item, ~Nil)
}
}
由于可变借用的问题,我不确定如何使用迭代方法实现这一点。迭代解决方案,使用
Box::borrow\u mut()
:
#[派生(调试)]
枚举列表{
节点(T,盒),
无
}
impl列表{
fn new()->List{List::Nil}
fn添加(&mut自我,项目:T){
使用std::borrow::BorrowMut;
让mut tail=self;
而让Self::Node(_,next)=tail{
tail=next.borrow_mut();
}
*tail=列表::节点(项,框::新建(列表::Nil));
}
}
谢谢!是的,有一个循环,但我在循环和递归方法之间来回移动,我想在某个点上我失去了它。将编辑。