在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead==NULL)
{
return NULL;
}
ListNode* fake=(ListNode*)malloc(sizeof(ListNode));//定义一而个假结点,这样就不用考虑头结点没有前驱结点这个特殊情况
fake->next=pHead;
ListNode* p1=pHead;
ListNode* p2=pHead->next;
ListNode*prev =fake;
while(p2!=NULL)//只要p2不为空,循环就一直执行
{
if(p2->val!=p1->val)//如果不等3个指针都向后走
{
prev=p1;
p1=p2;
p2=p2->next;//排队往后走
}
else
{
while(p2!=NULL&&p2->val==p1->val)//如果遇到相等的数了p2走
{
p2=p2->next;
}
//走到这p2要么不相等要么走到末尾了
prev->next=p2;//没有free结点,有内存泄漏
p1=p2;
if(p2!=NULL)
{
p2=p2->next;
}
}
}
return fake->next;
}