Вот код от answer to a similar question. Он показывает способ иметь список, который вы можете добавить к началу и концу, а к середине - для хорошей меры.
#[derive(Debug)]
struct Node<T> {
v: T,
next: Option<Box<Node<T>>>,
}
impl<T> Node<T> {
fn new(v: T) -> Node<T> { Node { v: v, next: None } }
fn push_front(self, head: T) -> Node<T> {
Node {
v: head,
next: Some(Box::new(self)),
}
}
fn push_back(&mut self, tail: T) {
match self.next {
Some(ref mut next) => next.push_back(tail),
None => self.next = Some(Box::new(Node::new(tail))),
}
}
fn push_after(&mut self, v: T) {
let old_next = self.next.take();
let new_next = Node {
v: v,
next: old_next,
};
self.next = Some(Box::new(new_next));
}
}
fn main() {
let mut n = Node::new(2u8);
n.push_back(3u8);
let mut n = n.push_front(0u8);
n.push_after(1u8);
println!("{:?}", n);
}
Важно то, что, когда мы добавим к голове, мы потребляем старую голову, принимая его как self
. Это позволяет нам переместить его в Box
, который станет последователем новой головы. Удаление элемента - это прямое расширение этого примера, но вам нужно немного взглянуть вперед и обработать больше случаев с краями (например, что делать, если не существует второго преемника).
Если возможно, разместите соответствующие выдержки из кода прямо в самом вопросе; так как ваш вопрос близок к бесполезным без ссылок. –