从单个链接列表中删除重复项


pub fn delete_duplicates(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
let mut head = head;
let mut cur = head.as_mut();
while cur.is_some() && cur.as_ref().unwrap().next.is_some() {
if cur.as_ref().unwrap().val == cur.as_ref().unwrap().next.as_ref().unwrap().val {
//let next = cur.unwrap().next.as_mut().unwrap().next.take();  (1) Error!
let next = cur.as_mut().unwrap().next.as_mut().unwrap().next.take();  // (2) Ok
cur.as_mut().unwrap().next = next;
}
else {
//cur = cur.as_ref().unwrap().next.as_mut();  (3) Error!
cur = cur.unwrap().next.as_mut();  // (4) Ok
}
}
head
}

上面的代码删除了自定义单链表中的重复项。(例如[1,1,2]->[1,2](
使用(2(和(4(编译并执行程序应该执行的操作。
(1(和(3(生成编译器错误,我无法理解这里发生了什么。

  • (1(为什么我们需要as_mut()?我相信cur已经变了
  • (3( 为什么在为左值赋值时不能使用as_ref()
  • (4( 这不是在消耗我们前进的选项吗

我创建了一个可复制的游乐场。其他人,如果我的答案是错误的,请用它来帮助和纠正我。

对于(1(,当您调用cur.unwrap()时,值(Option<&mut Box<ListNode>>(从cur移动。但当您调用cur.as_mut()时,它会给您一个Option<&mut &mut Box<ListNode>>,并且展开它不会移动cur的值。我创建了一个小的操场代码片段来说明这一点。

对于(3(,它有两个错误。

  1. 当您调用cur.as_ref()时,该值位于&之后,因此您无法访问其值,但在调用as_mut()时再次将其作为可变值借用

  2. 如果将(3(中的as_ref()调用替换为as_mut()调用,则只会看到另一个错误。

    Line 28, Char 17: cannot assign to `cur` because it is borrowed (solution.rs)
    |
    28 |                 cur = cur.as_mut().unwrap().next.as_mut();
    |                 ^^^^^^---^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |                 |     |
    |                 |     borrow of `cur` occurs here
    |                 assignment to borrowed `cur` occurs here
    |                 borrow later used here
    error: aborting due to previous error
    

    不能先借用cur的值,然后用新值重新分配cur,然后再使用借用的值。游乐场来说明这一点。

对于(4(,是的,它消耗cur的值,这是Option<&mut Box<ListNode>>,而不是Option<Box<ListNode>>,所以它是可以的

最新更新