我有这个用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++解决方案,请与我分享,谢谢你的帮助。
1条答案
按热度按时间5vf7fwbs1#
通过匹配而不是仅仅检查.is_none(),我们可以同时在& check for None中获取值。
然后我们在检查下一个项目是否在那里的时候取下它。通过使用
.take()
,我们避免了两个可变的电流借用,我们也用这种方法清理了内存。.as_mut()
只是把&mut Option<T>
变成Option<&mut T>
的一种方法