gpt4 book ai didi

data-structures - 在 Rust 中删除单链表中的节点

转载 作者:行者123 更新时间:2023-11-29 07:59:22 25 4
gpt4 key购买 nike

我是 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,
}
}
}

这里是 rust playground .我使用的是夜间版本和 edition = 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 语句 - 有一些 opinion that this could be a bug .

关于data-structures - 在 Rust 中删除单链表中的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53554862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com