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

时间:2015-11-13 05:47:17

标签: 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)});
}

创建链接列表y - &gt; x - &gt;空值。是否有可能在原地进行切换,以便最终得到x - &gt; y - &gt; null而不分配任何新节点?

1 个答案:

答案 0 :(得分:3)

绝对。在这种情况下,所有权非常简单:<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> </script> <textarea maxlength="5" placeholder="echo"></textarea> <br> <!-- set `x-custom-header` to `input type="text"` value --> <input type="text" maxlength="5" placeholder="set request header" /> <br /> <input type="button" value="download" /> <!-- set default `x-custom-header` to "123" --> <a data-headers='{"x-custom-headers":"123"}'></a>函数拥有main,拥有y,所有者可以改变他们拥有的东西。

要交换两个节点xa ba→...,您只需执行以下操作:

  • b断开b,以便您a→⊥和a→....
  • 删除b后的所有内容;请拨打此b。您现在有c…→⊥和b→....请注意c可能为空,也可能是长列表;我们不在乎。
  • ca现在已经独自存在,并且无法与其他任何内容相关联,因此您只需交换内容即可将其交换到原位。
  • b附加到c的末尾,为您提供aa→....
  • c附加到a的末尾,为您提供bb→....

没有新节点需要分配,这可以直接转录到Rust:

a

最后,如果我没有指出你Learning Rust With Entirely Too Many Linked Lists,我会失职。