如何使用Rust克隆一个链表?

zyfwsgd6  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(154)

我是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!();
    }
}
wvt8vs2t

wvt8vs2t1#

然而,我想知道是否有任何实现,我们不需要使用这样一个强大的武器。clone(),这样我就可以从这一点上深入研究。
首先,copyList实际引用列表节点本身似乎是合理的,更习惯的名称是copy_list

pub fn copy_list(head: &ListNode) -> ListNode {
        todo!()
    }

(no ;,因为我们想返回一个结果,分号将使函数返回())。第一步是(不一定,但很有用)对参数进行模式匹配,我们也知道我们希望在末尾返回一个ListNode,所以让我们在那里构造它:

pub fn copy_list(head: &ListNode) -> ListNode {
        let ListNode { val, next } = head;
        let copied_next = todo!();
        ListNode { val: todo!(), next: copied_next }
    }

剩下的就是计算copied_next(好吧,还有val,但它要简单得多)。我不会给予你完整的代码,但有一些提示:
1.考虑nextcopied_next的类型;
1.您可以在nextOption::mapBox::map上使用模式匹配;
1.您将在模式匹配或map的参数中的某个位置递归调用copy_list
(And简单地说,next.clone()也可以工作,并且大约是生成的clone()函数所做的,这就是为什么它克隆整个列表。

相关问题