Skip to content

83. Remove Duplicates from Sorted List

Remove Duplicates from Sorted List - LeetCode

考えたこと

  • nextとのvalを比較して、同じならnextを飛ばすように書き換える
  • Rubyで書いて、Rustで書き直したがRustの方が書くのが難しかった()

Ruby

def delete_duplicates(head)
current_node = next_node = head
while next_node
while current_node.val == next_node&.val
next_node = next_node.next
end
current_node.next = next_node
current_node = next_node
next_node = next_node&.next
end
head
end

Rust

impl Solution {
pub fn delete_duplicates(mut head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
let mut cur = &mut head;
while let Some(current) = cur.as_mut() {
while let Some(next) = &mut current.next {
if current.val != next.val {
break;
}
current.next = next.next.take();
}
cur = &mut current.next;
}
head
}
}
  • as_mut()を使うと所有権を移行せずに変更ができる
  • &mut と同じように思えるが、 &mutは直接使うのに対して as_mut()はOptionの中身を変更するために使う

let mut current = head;let mut current = &mut head;の違いは、それぞれが何を保持しているかにあります。

let mut current = head;headの所有権をcurrentに移動します。これは、headが所有権を持つ型(例えば、Box, String, Vecなど)の場合に重要です。この行を実行した後、headはもはや使用できません。currentheadの所有権を持ち、その値を変更することができます。

一方、let mut current = &mut head;headへのmutableな参照をcurrentに作成します。これは、headの値を変更するための一時的な手段として使用されますが、headの所有権は移動しません。この行を実行した後でも、headはまだ使用できます(ただし、currentを通じて値が変更される可能性があります)。