leetcode 3217. 从链表中移除在数组中存在的节点 中等
给你一个整数数组 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^51 <= nums[i] <= 10^5nums中的所有元素都是唯一的。- 链表中的节点数在
[1, 10^5]的范围内。 1 <= Node.val <= 10^5- 输入保证链表中至少有一个值没有在
nums中出现过。
分析:首先用一个哈希表,记录所有在 nums 数组中出现过的数字。接着遍历链表,检查有哪些数字出现过需要删除。由于头节点也可能被删掉,可以设置一个虚拟头节点指向原来的头节点,便于操作。最后返回虚拟头节点的后一个节点即可。
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/
struct ListNode* modifiedList(int* nums, int numsSize, struct ListNode* head) {int flag[100010]={0};for(int i=0;i<numsSize;++i)flag[nums[i]]++;struct ListNode *p,*q,*r;r=(struct ListNode*)malloc(sizeof(struct ListNode));r->next=head;p=r;while(p->next!=NULL){int temp=p->next->val;q=p->next;if(flag[temp])p->next=q->next,free(q);else p=q,q=q->next;}return r->next;
}