给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
解析:本题比较简单,如果没有空间要求,可以使用hashmap记录每个数字出现的次数,然后再构造一条新链表返回。
如果限定不能使用额外空间,只能使用常数空间,则需要在原链表上进行修改。
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==NULL||head->next==NULL)
return head;
ListNode* output=new ListNode(-1);
ListNode* q=output;
ListNode* p=head;
while(p!=NULL)
{ //如果节点出现重复
if(p->next!=nullptr && p->val==p->next->val){
ListNode* tmp=p;
//跳过该数字直到下一个数字或者nullptr
while(tmp!=NULL&&tmp->val==p->val)
{
tmp=tmp->next;
}
p=tmp;
} //不重复直接相连
else{
q->next=p;
q=q->next;
p=p->next;
}
} //类似1,2,2,3,3的情况,需要将返回的最后一个节点断掉
q->next=nullptr;
return output->next;
}
};