剑指offer 删除链表中重复的结点

来源:互联网 发布:直播软件类似yy 编辑:程序博客网 时间:2024/05/16 05:14

题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

思路:主要是细节的处理
首先如果头部要删除,那么是很复杂的事,因为是一个升序链表,所以在头部的前面加一个val-1的头结点,那么就可以从头部慢慢处理了。保存已经出现过的结点数目,然后从头开始遍历,保持两个指针,一个遍历指针,一个遍历指针的上一个指针。记得中途删除的时候,可能遍历指针指到空指针。
代码如下:

/*struct ListNode {    int val;    struct ListNode *next;    ListNode(int x) :        val(x), next(NULL) {    }};*/class Solution {public:    ListNode* deleteDuplication(ListNode* pHead)    {        if(pHead==nullptr||pHead->next==nullptr)  return pHead;        int val = pHead->val;        ListNode *cur;        cur=(struct ListNode *)malloc(sizeof(struct ListNode));          cur->val = val-1;        cur->next = pHead;        map<int,int>mp;        mp.clear();        ListNode *p,*last;        p = cur;        while(p)        {            int val = p->val;            ++mp[val];            p = p->next;        }        p = cur->next;        last = cur;        while(p!=nullptr)        {            int val = p->val;            if(mp[val]>1)            {                int cnt = mp[val];                while(cnt)                {                    //ListNode* mm;                   // mm = p ;                    p = p->next;                   // delete(mm);                    cnt--;                }                last->next = p;            }            if(p==nullptr)  break;            val = p->val;            if(mp[val]>1)  continue;            else             {                last = p;                p = p->next;            }        }        return cur->next;    }};
原创粉丝点击