跳到內容
Go back

Delete Nodes From Linked List Present in Array

Published:  at  10:30 AM

題目

給定一個整數陣列 nums 及連結串列的起始點 head 。請返回修改後連結串列的終點 head ,該修改需移除所有與陣列 nums 中數值相符的節點。

我的練習

# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next

class Solution:
    def modifiedList(self, nums: List[int], head: Optional[ListNode]) -> Optional[ListNode]:
        to_remove = set(nums)
        
        # dummy node,避免節點頭被刪除
        dummy = ListNode(0, head)
        current = dummy
        
        while current.next:
            if current.next.val in to_remove:
                # 跳過下一個節點
                current.next = current.next.next
            else:
                current = current.next

        return dummy.next
func modifiedList(nums []int, head *ListNode) *ListNode {
    toRemove := make(map[int]struct{})
    for _, num := range nums {
        toRemove[num] = struct{}{}
    }
    
    // dummy node
    dummy := &ListNode{Next: head}
    current := dummy
    
    for current.Next != nil {
        if _, exists := toRemove[current.Next.Val]; exists {
            // 跳過下一個節點
            current.Next = current.Next.Next
        } else {
            current = current.Next
        }
    }

    return dummy.Next
}
use std::collections::HashSet;

impl Solution {
    pub fn modified_list(nums: Vec<i32>, head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
        let to_remove: HashSet<i32> = nums.into_iter().collect();
        
        // dummy node
        let mut dummy = Box::new(ListNode::new(0));
        dummy.next = head;
        let mut current = &mut dummy;
        
        while let Some(next_node) = current.next.as_mut() {
            if to_remove.contains(&next_node.val) {
                // 跳過下一個節點
                current.next = next_node.next.take();
            } else {
                current = current.next.as_mut().unwrap();
            }
        }
        
        dummy.next
    }
}

Suggest Changes

Next Post
The Two Sneaky Numbers of Digitville