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