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.nextend
def skip_duplicates(node) duplicate_node = node while duplicate_node&.next&.val == duplicate_node.val duplicate_node = duplicate_node.next end duplicate_nodeendRust
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を使う