Skip to content

82. Remove Duplicates from Sorted List II

Remove Duplicates from Sorted List II - LeetCode

解法

  • 確定したものは prevとして保持する。
  • prev.nextをどうするか?をcurrent_nodeとnext_nodeで判定する。

Ruby

def delete_duplicates(head)
new_head = ListNode.new(nil, head)
prev = new_head
target = head
while target&.next
if target.val == target.next.val
duplicate_node = skip_duplicates(target)
target = duplicate_node
prev.next = duplicate_node.next
else
prev = target
end
target = target.next
end
new_head.next
end
def skip_duplicates(node)
duplicate_node = node
while duplicate_node&.next&.val == duplicate_node.val
duplicate_node = duplicate_node.next
end
duplicate_node
end

Rust

impl Solution {
// function nameが被っているので_iiをつけている。提出する際は消すこと
pub fn delete_duplicates_ii(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
let mut new_head = Some(Box::new(ListNode { val: 0, next: head }));
let mut prev = new_head.as_mut();
while let Some(mut current_node) = prev.as_mut().unwrap().next.take() {
if let Some(next_node) = current_node.next.as_mut() {
if current_node.val == next_node.val {
let duplicate_node = Self::skip_duplicates(current_node);
prev.as_mut().unwrap().next = duplicate_node.next;
} else {
prev.as_mut().unwrap().next = Some(current_node);
prev = prev.unwrap().next.as_mut();
}
} else {
prev.as_mut().unwrap().next = Some(current_node);
break;
}
}
new_head.and_then(|head| head.next)
}
fn skip_duplicates(mut node: Box<ListNode>) -> Box<ListNode> {
while let Some(next_node) = node.next.as_mut() {
if next_node.val == node.val {
node = node.next.take().unwrap();
} else {
break;
}
}
node
}
}
  • unwrap() の代わりに and_thenを使う