【问题标题】:How to split given linked list如何拆分给定的链表
【发布时间】:2020-12-12 17:24:22
【问题描述】:

给我链表节点结构如下:

#[derive(PartialEq, Eq, Clone, Debug)]
pub struct ListNode {
    pub val: i32,
    pub next: Option<Box<ListNode>>,
}

我需要编写一个方法来平均拆分链表并返回两个部分。我无法用一种方法完成,所以我创建了两个:第一个计算列表的长度,第二个拆分。

fn get_length(head: &Option<Box<ListNode>>) -> usize {
    let mut res = 0;
    let mut current_node = head;
    while current_node.is_some() {
        current_node = &current_node.as_ref().unwrap().next;
        res += 1;
    }
    res
}

fn split(mut head: Option<Box<ListNode>>, len: usize) -> (Option<Box<ListNode>>, Option<Box<ListNode>>) {
    let mut curr = head.take();
    for _ in 0..len {
        let mut curr_inner = curr.unwrap();
        curr = curr_inner.next.take();
    }
    (head, curr.take())
}

let len = get_length(&node);
let (l1, l2) = split(node, len / 2 + len % 2);

问题出在split() - 我失去了理智。我不知道如何保持它。 有人可以建议吗?

【问题讨论】:

    标签: rust linked-list


    【解决方案1】:

    您的算法有效,问题是take() 从选项中删除了值并将None 留在原来的位置。相反,您希望引用Option 中的值,这样您就可以遍历列表而不改变它。这是由.as_ref().as_mut() 完成的,它们返回Option&lt;&amp; (mut) T&gt;,其中引用指向原始T。然后,一旦我们获得了对后半部分的引用,我们将 take() 从中取出并获得列表尾部的所有权。

    fn split(
        mut head: Option<Box<ListNode>>,
        len: usize,
    ) -> (Option<Box<ListNode>>, Option<Box<ListNode>>) {
        let mut curr = &mut head;
        for _ in 0..len {
            let curr_inner = curr.as_mut().unwrap();
            curr = &mut curr_inner.next;
        }
        let tail = curr.take();
        (head, tail)
    }
    

    Playground link with test case

    【讨论】:

    • 这两种方法可以结合使用吗?使用单程拆分列表。我正在尝试,但由于借贷冲突而无法做到。
    • @EvgeniNabokov 你能解释一下你在这个答案中两次通过时所看到的究竟是什么吗?如果您的意思是 get_length(),那听起来像是一个新问题……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    相关资源
    最近更新 更多