zoukankan      html  css  js  c++  java
  • 删除单向非空有序链表中的重复结点,且不保留重复结点

    题目描述

    在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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; }
  • 相关阅读:
    Android:Unable to find explicit activity class报错
    家庭记账本2
    家庭记账本开发
    Android Studio中TableLayout(表格布局)
    Android Studio中View与ViewGroup的概念
    Android Studio反编译APK获取代码&资源
    Android程序签名打包
    Android Studio工程相关解析(各种文件,资源访问)
    Android Studio 的SDK更新不了问题解决
    模块
  • 原文地址:https://www.cnblogs.com/GuoYuying/p/11488676.html
Copyright © 2011-2022 走看看