删除单向非空有序链表中的重复结点,且不保留重复结点

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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; }
复制代码

 

posted @   _程序兔  阅读(314)  评论(0编辑  收藏  举报
编辑推荐:
· 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爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示