我是Rust的新手,目前我正在积极使用Rust编写LeetCode练习。
现在我正在处理这个问题,Copy List with Random Pointer,甚至没有人提供Rust版本的答案。
我尝试了一段时间,但后来我意识到在Rust中复制甚至是一个简单的链表都非常困难。
感谢@cafce25的帮助,我们可以直接使用.clone()
来实现它,这太棒了。然而,我想知道是否有任何实现,我们不需要使用这样一个强大的武器.clone()
,这样我就可以从这一点上深入研究。
谁能给予我个忙?非常感谢
下面提供了一些接口,请随时修改函数签名。
#[derive(PartialEq, Eq, Clone, Debug)]
pub struct ListNode {
pub val: i32,
pub next: Option<Box<ListNode>>,
}
impl ListNode {
pub fn new(val: i32) -> Self {
ListNode {
val,
next: None,
}
}
pub fn copyList(head: &Option<Box<ListNode>>) -> Option<Box<ListNode>> {
todo!();
}
}
1条答案
按热度按时间wvt8vs2t1#
然而,我想知道是否有任何实现,我们不需要使用这样一个强大的武器。clone(),这样我就可以从这一点上深入研究。
首先,
copyList
实际引用列表节点本身似乎是合理的,更习惯的名称是copy_list
:(no
;
,因为我们想返回一个结果,分号将使函数返回()
)。第一步是(不一定,但很有用)对参数进行模式匹配,我们也知道我们希望在末尾返回一个ListNode
,所以让我们在那里构造它:剩下的就是计算
copied_next
(好吧,还有val
,但它要简单得多)。我不会给予你完整的代码,但有一些提示:1.考虑
next
和copied_next
的类型;1.您可以在
next
或Option::map
和Box::map
上使用模式匹配;1.您将在模式匹配或
map
的参数中的某个位置递归调用copy_list
。(And简单地说,
next.clone()
也可以工作,并且大约是生成的clone()
函数所做的,这就是为什么它克隆整个列表。