Не могу заимствовать как изменяемый более одного раза ошибку в цикле - PullRequest
0 голосов
/ 04 февраля 2019

Я работаю над проблемой кода leetcode # 83 «Удаление дубликатов из отсортированного списка», но я застрял в этой проблеме проверки заимствования.

Структура ListNode задается проблемой, поэтому ее нельзя изменить.Я попытался реструктурировать цикл и оператор if, но я не нашел работающего решения.

Что я пытаюсь сделать:

// Definition for singly-linked list.
#[derive(PartialEq, Eq, Debug)]
pub struct ListNode {
    pub val: i32,
    pub next: Option<Box<ListNode>>,
}

impl ListNode {
    #[inline]
    fn new(val: i32) -> Self {
        ListNode { next: None, val }
    }
}

fn remove_duplicates(mut list: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
    let mut cursor = &mut list;
    while let Some(c) = cursor.as_mut() {
        if let Some(next) = c.next.as_mut() {
            if next.val == c.val {
                c.next = next.next.take();
                continue;
            }
        }
        cursor = &mut c.next;
    }
    list
}

Ошибка, которую я получаю:

error[E0499]: cannot borrow `*cursor` as mutable more than once at a time
  --> src/lib.rs:17:25
   |
17 |     while let Some(c) = cursor.as_mut() {
   |                         ^^^^^^ mutable borrow starts here in previous iteration of loop

Упрощенный код, который, кажется, показывает ту же ошибку:

fn remove_duplicates(mut list: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
    let mut cursor = &mut list;
    while let Some(c) = cursor.as_mut() {
        if c.val > 0 {
            cursor = &mut c.next;
        }
    }
    list
}

Я не понимаю, почему изменяемый заем не был отброшен до следующей итерации цикла.Похоже, это вызвано условным изменением курсора, но я не понимаю, почему это помешало бы сбросу заимствования.

1 Ответ

0 голосов
/ 05 февраля 2019

Вот решение, которое я выбрал.Переназначение cursor в операторе if решает проблему.

fn remove_duplicates(mut list: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
    let mut cursor = list.as_mut();
    while let Some(c) = cursor {
        if let Some(next) = c.next.as_mut() {
            if next.val == c.val {
                c.next = next.next.take();
                cursor = Some(c);
                continue;
            }
        }
        cursor = c.next.as_mut();
    }
    list
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...