【剑指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;
}

 

 

posted @ 2020-03-09 16:46  知道了呀~  阅读(363)  评论(0编辑  收藏  举报