删除单向非空有序链表中的重复结点,且不保留重复结点
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?