给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5 输出: 1->2->5
示例 2:
输入: 1->1->1->2->3 输出: 2->3
//==============================================================
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteDuplicates(struct ListNode* head) {
//处理特殊条件
if(head == NULL || head->next == NULL)
{
return head;
}
int delHeadFlag = 0;
struct ListNode *pnext=head;
//获得头结点
while(head->next)
{
pnext = head->next;
if(head->val == pnext->val) //删除所有与头结点重复数值的结点
{
head->next = pnext->next;
free(pnext);
delHeadFlag = 1; //头结点是否需要删除的标记,最后进行删除操作
}
else
{
break;
}
}
//处理后续所有结点
int delNextFlag = 0;
struct ListNode *prev=head; //prev设置为头结点
struct ListNode *pcur=prev->next; //pcur设置为头结点的下一个结点
if(pcur) //如果当前结点不为空,则处理后续所有结点
{
while(pcur->next) //如果当前结点下一个结点不为空,则继续处理
{
pnext=pcur->next; //pnext指向当前结点的下一个结点
if(pcur->val == pnext->val) //如果当前结点和下一个结点重复, 则删除当前结点,前进一步
{
prev->next = pnext;
free(pcur);
pcur = pnext;
delNextFlag = 1; //设置当前处理结点的删除标记
}
else //如果当前结点与下一个结点不重复
{
if(delNextFlag) //当前结点有删除标记,则删除当前结点,然后前进一步
{
prev->next = pnext;
free(pcur);
pcur=pnext;
delNextFlag=0;
}
else //否则,前进一步
{
prev=pcur;
pcur=pnext;
}
}
}
if(delNextFlag) //如果最后尾结点有删除标记,则删除
{
prev->next = pcur->next;
free(pcur);
delNextFlag=0;
}
}
if(delHeadFlag) //处理头结点的删除标记
{
pnext=head;
head = head->next;
free(pnext);
}
return head;
}