zoukankan      html  css  js  c++  java
  • 【剑指offer】删除链表中重复的结点

    题目描述

    在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
     
    题解:链表是有序的,去除重复出现的元素,新建一个链表保存其它元素即可
    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
            val(x), next(NULL) {
        }
    };
    */
    class Solution {
    public:
        ListNode* deleteDuplication(ListNode* pHead)
        { 
            ListNode* H= (ListNode*)malloc(sizeof(ListNode));//新建一个链表保存不重复出现的元素
            ListNode* E=H;
            ListNode* now=pHead;
             
            while(now!=NULL)
            {
                if(now->next!=NULL && now->val==now->next->val)
                {
                    ListNode* temp=now->next;
                    while(temp->next!=NULL && temp->val==temp->next->val)//连续重复
                        temp=temp->next;
                    now=temp->next;
                }
                else
                {
                    E->next=now;
                    E=E->next;
                    now=now->next;
                }
            }
             
            E->next=NULL;
             
            return H->next;
        }
    };

    自己另外写了个直接删除重复元素的,但是过不了,可能是内存泄漏了,也把它贴一下

    #include<iostream>
    #include<stdlib.h>
    #include<string>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    struct ListNode
    {
        int val;
        ListNode *next;
    };
    
    ListNode* deleteDuplication(ListNode* pHead)
    {
        ListNode *now=(ListNode *)malloc(sizeof(ListNode));
        now=pHead;
        while(now->next!=NULL)
        {
            ListNode *pre=now;
            now=now->next;
            if(now->next!=NULL&&now->val==now->next->val)
            {
                ListNode *temp=now->next;
                while(temp->next!=NULL&&temp->val==temp->next->val)
                    temp=temp->next;
                pre->next=temp->next;
                now=pre;
            }
    
        }
        return pHead->next;
    }
    
    int main()
    {
        int n, m;
        cin >> n;
        ListNode *H = (ListNode*)malloc(sizeof(ListNode));
        ListNode *E = (ListNode*)malloc(sizeof(ListNode));
        E = H;
        for (int i = 0; i < n; i++)
        {
            cin >> m;
            ListNode* temp = (ListNode*)malloc(sizeof(ListNode));
            temp->val = m;
            temp->next = NULL;
            E->next = temp;
            E = temp;
        }
        ListNode *tp = deleteDuplication(H);
        while (tp != NULL)
        {
            cout << tp->val << ' ';
            tp = tp->next;
        }
        cout << endl;
        return 0;
    }
  • 相关阅读:
    【转】浅谈MVC与三层架构
    【转】小结登录的几种交互方式
    【转】 App架构设计经验谈:接口的设计
    【转】JS编码解码、C#编码解码
    jQuery 判断是否包含某个属性
    jQuery on()方法
    常用正则表达式大全
    Fiddler 抓取手机APP数据包
    [Asp.net]通过uploadify将文件上传到B服务器的共享文件夹中
    ★电车难题的n个坑爹变种
  • 原文地址:https://www.cnblogs.com/-citywall123/p/12449567.html
Copyright © 2011-2022 走看看