Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 是否可以在不分配任何节点的情况下反转链接列表?_Rust - Fatal编程技术网

Rust 是否可以在不分配任何节点的情况下反转链接列表?

Rust 是否可以在不分配任何节点的情况下反转链接列表?,rust,Rust,我试图了解Rust的所有权是如何与链表相关的。我有以下代码: struct Node { value: i32, next: Option<Box<Node>> } fn main() { let mut x = Box::new(Node {value: 1, next: None}); let mut y = Box::new(Node {value: 2, next: Some(x)}); } struct节点{ 值:i32, 下

我试图了解Rust的所有权是如何与链表相关的。我有以下代码:

struct Node {
    value: i32,
    next: Option<Box<Node>>
}

fn main() {
    let mut x = Box::new(Node {value: 1, next: None});
    let mut y = Box::new(Node {value: 2, next: Some(x)});
}
struct节点{
值:i32,
下一步:选项
}
fn main(){
让mut x=Box::new(节点{value:1,next:None});
让mut y=Box::new(节点{value:2,next:Some(x)});
}

这将创建一个链表y->x->null。有没有可能在适当的位置切换,这样我们就可以在不分配任何新节点的情况下得到x->y->null。这种情况下的所有权非常简单:
main
函数拥有
y
,它拥有
x
,所有者可以改变他们拥有的东西

交换两个节点
a
b
,其中
a
→ <代码>b→ …, 您只需执行以下操作:

  • 断开
    b
    a
    的连接,这样您就拥有了
    a
    → ⊥ 和
    b
    → ….
  • 删除
    b
    之后的所有内容;称之为
    c..
    。您现在有了
    b
    → ⊥, 和
    c
    → …. 请注意,
    c
    可能为空,或者可能是一个长列表;我们不在乎
  • a
    b
    现在是单独的,并且不连接到其他任何东西,因此您可以只交换它们的内容,在适当的位置交换它们
  • c
    附加到
    a
    的末尾,为您提供
    a
    → <代码>c→ ….
  • a
    附加到
    b
    的末尾,为您提供
    b
    → <代码>a→ ….
无需分配新节点,这几乎可以直接转录到Rust中:

struct节点{
值:i32,
下一步:选项
}
impl节点{
发布fn与下一个交换(&M){
使用std::mem::swap;
匹配self.next.take(){
一些(mut next_节点)=>{
让next_next=next_node.next.take();
交换(self和mut next_节点);
next_node.next=next_next;
self.next=Some(next_节点);
},
无=>{
//哦,没什么可交换的!
惊慌失措!(“无法无条件交换”);
}
}
}
酒吧fn秀(和自我){
打印!(“{:?}”,self.value);
如果让Some(next)=self.next.as_ref(){
打印!(“->”);
next.show();
}
}
}
fn main(){
让mut w=Box::new(节点{value:0,next:None});
让mut x=Box::new(节点{value:1,next:Some(w)});
让mut y=Box::new(节点{value:2,next:Some(x)});
y、 show();
println!(“”);
y、 将_与_next()交换;
y、 show();
println!(“”);
}
最后,如果我不把你指给我看,那我就是失职了