lintcode--删除排序链表中的重复数字

来源:互联网 发布:数据库设计实例 编辑:程序博客网 时间:2024/06/07 02:25

题目描述:
给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。

样例:
给出 1->2->3->3->4->4->5->null,返回 1->2->5->null

给出 1->1->1->2->3->null,返回 2->3->null

思路讲解:
这个题目很容易就理解题目意思,但是实际做起来,不知道从何入手,首先我们的意思就是直接将链表中的重复的元素删除,这样就需要我们记住该节点前面的一个链表节点,但是这就会很繁琐。
故我的方法是将所有的节点信息都放入vector向量中,然后对其进行分类分成两类即需要删除的以及不需要删除的,然后我们再将不需要删除的提取出来,然后将其进行链表连接即可,最后返回这个vector向量的首元素即可。

具体代码如下:

/** * Definition of ListNode * class ListNode { * public: *     int val; *     ListNode *next; *     ListNode(int val) { *         this->val = val; *         this->next = NULL; *     } * } */class Solution {public:    /*     * @param head: head is the head of the linked list     * @return: head of the linked list     */    ListNode * deleteDuplicates(ListNode * head) {        // write your code here        if(head==NULL)        {            return NULL;        }        ListNode *p;        p=head;        vector<ListNode *> res;//存储节点的向量数组        while(p!=NULL)        {            res.push_back(p);            p=p->next;        }        int *flag=new int[res.size()];//由于我们需要判断那个节点需要删除,所以我们引入一个辅助数组,其标识具体位置是否需要删除        for(int i=0;i<res.size();i++)        {            flag[i]=0;        }        int f=0;//标识这个数字前面是否出现了        for(int i=1;i<res.size();i++)        {            if(res[i]->val==res[i-1]->val)            {                flag[i-1]=1;                f=1;            }            if(res[i]->val!=res[i-1]->val&&f==0)            {                flag[i-1]=0;            }            if(res[i]->val!=res[i-1]->val&&f==1)            {                flag[i-1]=1;                f=0;            }        }        if(f==1)        {            flag[res.size()-1]=1;        }        else        {            flag[res.size()-1]=0;        }        vector<ListNode *> array;//将不需要删除的节点保存到该向量数组中        for(int i=0;i<res.size();i++)        {            if(flag[i]==0)            {                array.push_back(res[i]);            }        }        if(array.size()==0)        return NULL;        for(int i=0;i<array.size()-1;i++)//对筛选出来的数组进行连接        {            array[i]->next=array[i+1];        }        array[array.size()-1]->next=NULL;//尾节点的特殊处理        return array[0];    }};
阅读全文
0 0
原创粉丝点击