题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路:主要是细节的处理
首先如果头部要删除,那么是很复杂的事,因为是一个升序链表,所以在头部的前面加一个val-1的头结点,那么就可以从头部慢慢处理了。保存已经出现过的结点数目,然后从头开始遍历,保持两个指针,一个遍历指针,一个遍历指针的上一个指针。记得中途删除的时候,可能遍历指针指到空指针。
代码如下:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead==nullptr||pHead->next==nullptr) return pHead;
int val = pHead->val;
ListNode *cur;
cur=(struct ListNode *)malloc(sizeof(struct ListNode));
cur->val = val-1;
cur->next = pHead;
map<int,int>mp;
mp.clear();
ListNode *p,*last;
p = cur;
while(p)
{
int val = p->val;
++mp[val];
p = p->next;
}
p = cur->next;
last = cur;
while(p!=nullptr)
{
int val = p->val;
if(mp[val]>1)
{
int cnt = mp[val];
while(cnt)
{
//ListNode* mm;
// mm = p ;
p = p->next;
// delete(mm);
cnt--;
}
last->next = p;
}
if(p==nullptr) break;
val = p->val;
if(mp[val]>1) continue;
else
{
last = p;
p = p->next;
}
}
return cur->next;
}
};