要注意这个链表的第一个元素也有可能被删除掉 所以加了一个空的前驱指针
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head||!head->next)
return head;
ListNode* ptrnull=new ListNode(0);
ptrnull->next=head;
ListNode* pre;//前驱指针 指向满足条件的最后一个元素
ListNode* scan;//指向正在扫描的元素
pre=ptrnull;
scan=head;
while(scan)
{
int count=0;//记录有几个元素和scan中的元素相同
ListNode *temp=scan->next;
while(temp&&temp->val==scan->val)
{
count++;
temp=temp->next;
}//循环结束后 temp指向和scan不同的元素 或者为空
if(count>0)//删除重复元素 将scan指向下面一个要扫描的元素
{
pre->next=temp;
scan=temp;
}
else//count==0 不存在要删除的元素 则更新pre指针和 scan 指针
{
pre=scan;
scan=temp;
}
}
return ptrnull->next;
}
};