Rust 是否可以在不分配任何节点的情况下反转链接列表?
我试图了解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, 下
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
→ <代码>c→ ….李>a
- 将
附加到a
的末尾,为您提供b
→ <代码>a→ ….李>b
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!(“”);
}
最后,如果我不把你指给我看,那我就是失职了