假设一个链表是一个排序链表,中间存在重复的结点,现在要求删除重复的结点,返回链表的头部。
例:输入为[1,1,2,3,3,4,4,4,5,6]。则输出应该为[2,5,6]。
分析如下:对于一个排序的链表,对于一个重复的结点,它与其前或者其后的结点是相同的,因此通过遍历链表得到重复结点的第一个结点即可以找到其余的结点,然后依次删除。此算法的时间复杂度为O(n)。
实现代码如下:
ListNode* deleteDuplication(ListNode* pHead)
{
ListNode *cur;
ListNode *pre;
ListNode *q;
if(pHead == NULL)
return NULL;
pre = pHead;
cur = pHead;
while(cur!=NULL)
{
q = cur->next;
if(cur->next!=NULL && cur->val == q->val)
{
while(q->next!= NULL && q->val == q->next->val)
{
q = q->next;//q指向最后一个重复点
}
if(cur == pHead)
{
pHead = q->next;
}
else
{
pre->next = q->next;
}
cur = q->next; //当前的cur节点要删掉
}
else
{
pre = cur;
cur = cur->next;
}
}
return pHead;
}