Удалить узел в односвязном списке в Rust - PullRequest
0 голосов
/ 30 ноября 2018

Я новичок в Rust и хочу написать связанный список в Rust, чтобы повеселиться.Я запутался в том, как удалить узел в связанном списке.Вот мой простой код.

#[derive(Debug)]
struct Node{
    v: usize,
    next: Option<Box<Node>>,
}

struct LinkedList {
    head: Option<Box<Node>>,
}

impl LinkedList {
    fn remove(&mut self, v: usize) -> Option<usize> {
        let mut current_node: &mut Option<Box<Node>> = &mut self.head;
        loop {
           match current_node {
                None => break,
                Some(node) => {
                    if node.v == v {
                        // current_node = what? 
                        // ???????????????
                        break;
                    } else {
                        current_node = &mut node.next;
                    }
                },
            };
        }

        match current_node.take().map(|x| *x) {
            Some(node) => {
                *current_node = node.next;
                return Some(node.v)
            },
            None => None,
        }
    }
}

А вот и ржавчина детская площадка .Я использую ночную версию и edition = 2018.В цикле я пытаюсь найти узел, следующий узел которого содержит значение, которое я ищу.Тем не менее, я запутался о том, что писать в ??положение.

1 Ответ

0 голосов
/ 30 ноября 2018

На самом деле нет кода, который может пойти в это пространство, чтобы исправить это;вам нужно будет внести некоторые большие изменения.

Одна из проблем заключается в том, что вы заимствовали текущий узел в current_node, но затем нужно изменить его, пока эта ссылка еще существует.

Используя нелексические времена жизни в Выпуске 2018, вы можете сделать:

impl LinkedList {
    fn remove(&mut self, v: usize) -> Option<usize> {
        let mut current = &mut self.head;
        loop {
            match current {
                None => return None,
                Some(node) if node.v == v => {
                    *current = node.next.take();
                    return Some(v);
                },
                Some(node) => {
                    current = &mut node.next;
                }
            }
        }
    }
}

Каким-то образом, используя защитную скобу if node.v == v для создания двух спичечных ветвей, вместо использования условия if внутриодна спичечная рука позволяет заемщику определить, что это безопасно.Я не уверен, почему оператор if внутри плеча матча не разрешен - есть мнение, что может быть ошибкой .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...