在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,
重复的结点不保留,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
解题思路:
1.保存当前结点的上一个结点;
2.看下一个结点的值是否和当前结点cur相同,如果相同,
next继续向后遍历,找到第一个和当前结点不同的结点next;
3.删除当前结点cur–next之间的所有结点;
4.重新连接prev–next;
如果cur和next的值不同,cur后移一步,prev指向cur,
next向后移步一位
ListNode* deleteDuplication(ListNode* pHead)
{
struct ListNode* prev = NULL;
struct ListNode* cur = pHead;
struct ListNode* next = pHead->next;
if(pHead == NULL && pHead->next == NULL)
{
return pHead;
}
while(next)
{ //判断当前结点的值是否和下一个结点相同
if(cur->val == next->val)
{ //向后找第一个值不相等的结点
next = next->next;
while(next)
{
if(next->val != cur->val)
break;
next = next->next;
}
//删除cur到next之间的结点
while(cur != next)
{
struct ListNode* temp = cur;
cur = cur->next;
free(temp);
}
//重新连接链表
if(prev == NULL)//如果删除的是头结点
{
pHead = next;
}
else
{
prev->next = next;
}
if(next)//判断最后一个有没有值,有值的话继续走
next = next->next;
}
else
{
prev = cur;
cur = cur->next;
next = next->next;
}
}
return pHead;
}