从C++中删除重复链表的 rust 解

qojgxg4l  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(211)

我有这个用c++写的解决remove-duplicates-from-sorted-list问题的代码,现在我正在学习rust,我想用rust编程语言构建同样的解决方案。

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if (!head) return head;

        ListNode* current = head;
        while (current->next) {
            if (current->next->val == current->val)
                current->next = current->next->next;
            else 
                current = current->next;
        }
        return head;
    }
};

我不想改变我的方法来解决这个问题,因为任何算法可以用任何编程语言编写,也许是不同的单词,但计算机执行的步骤是相同的。
我无法在不展开current.unwrap().next的情况下编写while (current->next)的验证,如果当前为None,则会引发死机。
这里也是current->next = current->next->next;,我第一个想法是current.unwrap().next = current.unwrap().next.unwrap().next;
我试着在Rust文档中阅读有关选项和匹配模式以及如何使用Some while来解决我的问题,但我找不到任何类似的例子。
我只可以遍历我的单一linkedList而不修改我的头指针和丢失的数据像这样的代码。

pub fn delete_duplicates(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
        if head.is_none() {
            return head
        };
    
        let mut current = &head;
    
        while let Some(node) = current {
            current = &node.next;
        }
        head
    }

如果你知道如何编写我的C++解决方案,请与我分享,谢谢你的帮助。

5vf7fwbs

5vf7fwbs1#

impl Solution {
    pub fn delete_duplicates(mut head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {

通过匹配而不是仅仅检查.is_none(),我们可以同时在& check for None中获取值。

// if (!head) return head;
        // ListNode* current = head;
        let mut current = match head.as_mut() {
            Some(c) => c,
            None => return head,
        };

然后我们在检查下一个项目是否在那里的时候取下它。通过使用.take(),我们避免了两个可变的电流借用,我们也用这种方法清理了内存。

// while (current->next) {
        while let Some(mut rest) = current.next.take() {
            // if (current->next->val == current->val)
            if rest.val == current.val {
                // current->next = current->next->next;
                current.next = rest.next;
            } else {
                // since we took earlier we gotta put it back
                current.next = Some(rest);
                // current = current->next;
                // unwrap is perfectly fine since we just set it to Some(rest)
                current = current.next.as_mut().unwrap();
            }
        }
        return head;
    }
}

.as_mut()只是把&mut Option<T>变成Option<&mut T>的一种方法

相关问题