泪奔,终于写出一个版本。

这个版本遇到最大的问题是,用一个引用来遍历各个节点的 next,最终可以指向最后一个非空值节点的 next (该 next 指向链表最末的空值节点)。一开始使用只读引用,最后只能找到所需要的节点,但无法修改它。

随后把这个引用改为可写引用,但是在使用 while let 的时候,已经借用过它,则后期给它赋新值时,不能再次借用:

while let Node::Valued { val, next } = cur.as_mut() { // 第一次可写借用
    // ... 省略 ...
}
mem::replace(cur, new_node); // 作为 mem::replace() 第一个参数,是另一次可写借用

最后不得已用一个计数器来,帮助将整个过程放在 while let 内部进行。如果是最末一个 next,就地操作 next 而非游标变量,因为游标变量值的所有权转移到内部这个 next 变量中。


完整代码 👇