题目描述: 给定一个链表的第一个节点 head ,找到链表中所有出现多于一次的元素,并删除这些元素所在的节点。 返回删除后的链表。
示例 1: 输入: head = [1,2,3,2] 输出: [1,3] 解释: 2 在链表中出现了两次,所以所有的 2 都需要被删除。删除了所有的 2 之后,我们还剩下 [1,3] 。
示例 2: 输入: head = [2,1,1,2] 输出: [] 解释: 2 和 1 都出现了两次。所有元素都需要被删除。
示例 3: 输入: head = [3,2,2,1,3,2,4] 输出: [1,4] 解释: 3 出现了两次,且 2 出现了三次。移除了所有的 3 和 2 后,我们还剩下 [1,4] 。
提示: 链表中节点个数的范围是 [1, 105] 1 <= Node.val <= 105
方法1: 主要思路:解题链接汇总 (1)先统计出各个数字的个数; (2)然后遍历链表,删除重复个数大于1的节点;
class Solution {
public:
ListNode* deleteDuplicatesUnsorted(ListNode* head) {
unordered_map<int,int> mp;
ListNode* dummy = new(ListNode);
dummy->next=head;
while(head){
mp[head->val]++;
head=head->next;
}
head=dummy->next;
ListNode* pre=dummy;
while(head){
if(mp[head->val]>1){
pre->next=head->next;
}else{
pre=pre->next;
}
head=head->next;
}
return dummy->next;
}
};
//go语言实现
func deleteDuplicatesUnsorted(head *ListNode) *ListNode {
mp := make(map[int]int,0)
dummy := new(ListNode)
dummy.Next=head
for head!= nil {
if mp[head.Val]==0 {
mp[head.Val]=1
}else{
mp[head.Val]++
}
head=head.Next
}
head=dummy.Next
pre := dummy
for head != nil {
if mp[head.Val]>1 {
pre.Next=head.Next
}else {
pre=pre.Next
}
head=head.Next
}
return dummy.Next
}
|