2015-01-19 1 views
0

Отдельно связанный список можно просто создать из хвоста. Но не могу от головы, я пробовал много раз, код здесь: https://gist.github.com/tioover/8d7585105c06e01678a8.Могу ли я перемещаться по одному связанному списку без переезда владельца или небезопасно?

Фактически, я хочу, чтобы поиск удалял узел в связанном списке. но я не могу обходить связанный список с изменяемым типом заимствования: https://gist.github.com/tioover/526715ed05342ef5b4f1. Я тоже много пробовал.

+1

Если возможно, разместите соответствующие выдержки из кода прямо в самом вопросе; так как ваш вопрос близок к бесполезным без ссылок. –

ответ

2

Вот код от 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, который станет последователем новой головы. Удаление элемента - это прямое расширение этого примера, но вам нужно немного взглянуть вперед и обработать больше случаев с краями (например, что делать, если не существует второго преемника).

+0

спасибо! Я покинул кемпинг когда-то, но он решил, что удаление funtion - https://gist.github.com/tioover/f9632449aab6fce840a4 –

 Смежные вопросы

  • Нет связанных вопросов^_^