【发布时间】:2019-10-12 03:28:54
【问题描述】:
我是 Rust 的新手,我只是在做一些练习。
有一个链表。例如 0->1->2->3->4,在索引 2 处将其截断,然后将两者反转,然后组合它们。 => 0 3 => 2->1->0->4->3
我需要获取第一个节点0的可变借用,获取到最后一个节点后设置0.next=44#[derive(debug)]
struct Node{
val: usize,
next: Option<Box<Node>>,
}
impl Node {
fn new(i: usize) -> Node {
...
}
fn reverse_at(self, k: usize) -> Box<Node> {
let mut prev = None;
let mut curr = Box::new(self);
let first_part_tail = &mut curr;
let mut i: usize = 0;
while i <= k {
let next = curr.next.take();
curr.next = prev;
match next {
Some(next_node) => {
prev = Some(curr);
curr = next_node;
}
None => return curr,
}
i += 1;
}
let head = prev.unwrap();
prev = None;
loop {
let next = curr.next.take();
curr.next = prev;
match next {
Some(next_node) => {
prev = Some(curr);
curr = next_node;
}
None => {
first_part_tail.next = Some(curr);
return head;
}
}
}
}
}
error[E0499]: cannot borrow `curr.next` as mutable more than once at a time 发生了,我不知道该怎么办。这让我困扰了很长时间。请帮忙。
&,我想这个函数会改变节点本身。而且我不知道如何将自引用更改为新节点,所以我使用了self。如果有人可以修改它,那也有帮助。
也许,把这个函数改成
fn reverse_at(&mut self, k:usize){
...
}
【问题讨论】:
-
在 Rust 游乐场 (play.rust-lang.org) 中包含一个带有 main 的完整示例可能会有所帮助。我开始查看并注意到您在方法签名中的 self 之前缺少
&。见:doc.rust-lang.org/1.30.0/book/2018-edition/… -
@Ultrasaurus 我已经添加了游乐场链接。
&,我想这个函数会改变节点本身。而且我不知道如何将自引用更改为新节点,所以我使用了self。如果有人可以修改它,那也有帮助。 -
与您的错误无关,我看不到您的程序如何创建链接列表...请参见仅使用“new”play.rust-lang.org/… 的操场示例
-
我发现了这个非官方的 rust 学习资源,里面有很多可能有用的链表示例:rust-unofficial.github.io/too-many-lists
-
@Ultrasaurus 结构节点来自其他东西。只需
Node::new(1234),这将创建一个链表,4->3->2->1->None。Node::new(1)将创建 1-> 无。我去看看学习资源,谢谢。
标签: rust