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));
}
}

谢谢!是的,有一个循环,但我在循环和递归方法之间来回移动,我想在某个点上我失去了它。将编辑。