铁锈写个单链表都是地狱级硬核操作(三)
泪奔,终于写出一个版本。
这个版本遇到最大的问题是,用一个引用来遍历各个节点的 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
变量中。
完整代码 👇