目标
给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。
示例 1:

输入: nums = [1,2,3], head = [1,2,3,4,5]
输出: [4,5]
解释:
移除数值为 1, 2 和 3 的节点。
示例 2:

输入: nums = [1], head = [1,2,1,2,1,2]
输出: [2,2,2]
解释:
移除数值为 1 的节点。
示例 3:

输入: nums = [5], head = [1,2,3,4]
输出: [1,2,3,4]
解释:
链表中不存在值为 5 的节点。
说明:
- 1 <= nums.length <= 10^5
- 1 <= nums[i] <= 10^5
- nums 中的所有元素都是唯一的。
- 链表中的节点数在 [1, 10^5] 的范围内。
- 1 <= Node.val <= 10^5
- 输入保证链表中至少有一个值没有在 nums 中出现过。
思路
依题意模拟即可,删除链表中的指定节点。
代码
/**
* @date 2025-11-03 13:55
*/
public class ModifiedList3217 {
public ListNode modifiedList_v1(int[] nums, ListNode head) {
Set<Integer> set = new HashSet<>(nums.length, 1);
for (int num : nums) {
set.add(num);
}
ListNode dummy = new ListNode(0, head);
ListNode prev = dummy;
while (head != null) {
if (set.contains(head.val)) {
prev.next = head.next;
} else {
prev = head;
}
head = head.next;
}
return dummy.next;
}
}
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
性能
