删除单向非空有序链表中的重复结点,且不保留重复结点
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
这个算法自己在牛客上编辑通过后又百度查了一下其他人的做法,发现大家都是用了两层循环来解决,我还是比较喜欢一遍跑,自己的思路是边跑边删,与保留重复结点的做法一样,只不过在删完一个重复结点后,将本身的结点再删除,然后继续比对,但是总觉得这个有缺陷,看着很不舒服,没有嵌套的循环看着舒服,暂时先贴出来吧
ListNode* deleteDuplication(ListNode* pHead) { ListNode *p = pHead, *pf = NULL; int var; while(p && p->next){ if(p->next->val == p->val){ ListNode *q = p->next; p->next = q->next; free(q); var = p->val; }else{ if(p->val == var){ //删除作为重复标识的结点 if(!pf){ pHead = pHead->next; free(p); p = pHead; }else{ pf->next = p->next; free(p); p = pf->next; } }else{ pf = p; p = p->next; } } }
//后面这段是处理的最繁琐的,看着多余,由于循环退出后最后一个结点仍可能存在并且可能是最后的重复结点,所以这里多加了一个判断处理操作,但是看着真的很恶心啊 啊啊啊 if( p && p->val == var){ if(!pf){ pHead = pHead->next; free(p); p = pHead; }else{ pf->next = p->next; free(p); p = pf->next; } } return pHead; }