转载自https://www.cnblogs.com/ariel-dreamland/p/9159155.html
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
示例 2:
示例给出的例子,重复的数都是相连的,考虑问题时我以为存在重复的数不相邻的情况,所以用了map,第一次遍历来统计所有各val值出现的次数。然而,程序没调通,AC为0。。。。。
#include<cstdlib>
#include<map>
#include<iterator>
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head || head->next == NULL) return head;
ListNode *node = head, *next = NULL;
map<int,int> mymap;
map<int,int>::iterator iter;
while(node != NULL)
{
iter = mymap.find(node->val);
if(iter != mymap.end())
{
mymap[node->val]++;
}
else
mymap.insert(pair<int, int>(node->val, 0));
}
while(mymap[head->val] > 1)
{
head = head->next;
}
node = head;
while(node->next != NULL)
{
if(mymap[node->next->val] > 1)
{
node->next = node->next->next;
continue;
}
node = node->next;
}
return head;
}
};
而后,看了下别人写的
由于链表开头可能会有重复项,被删掉的话头指针会改变,而最终却还需要返回链表的头指针。所以需要定义一个新的节点,然后链上原链表,然后定义一个前驱指针和一个现指针,每当前驱指针指向新建的节点,现指针从下一个位置开始往下遍历,遇到相同的则继续往下,直到遇到不同项时,把前驱指针的next指向下面那个不同的元素。如果现指针遍历的第一个元素就不相同,则把前驱指针向下移一位。
class Solution {
public:
ListNode *deleteDuplicates(ListNode *head) {
if (!head || !head->next) return head;
ListNode *start = new ListNode(0);
start->next = head;
ListNode *pre = start;
while (pre->next) {
ListNode *cur = pre->next;
while (cur->next && cur->next->val == cur->val)
cur = cur->next;
if (cur != pre->next)
pre->next = cur->next;
else
pre = pre->next;
}
return start->next;
}
};