【數據結構】 ——刪除鏈表中的重複節點(不保留重複節點)

刪除鏈表中的重複節點(不保留重複節點)

在這裏插入圖片描述
(劍指offer上面對這個題難度是4(總共五顆星),我尋思着,是我最近進步了?我覺得沒那麼難吧)

說下我的思路:利用map存儲鏈表節點的值和次數,遍歷map,當map元素次數爲1的時候,開闢一個新結點,將次數爲1的值存儲起來,掛到新鏈表中,最後返回新鏈表的頭。

這裏要注意的是爲了防止第一個和第二個就是重複節點,例如{1,1},我們在構造新鏈表的時候,最好加一個頭部。
代碼:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead==NULL||pHead->next==NULL)
            return pHead;
        ListNode* res=new ListNode(0);
        ListNode* tail=res;
        map<int,int> m;
        ListNode* cur=pHead;
        while(cur)
        {
            m[cur->val]++;
            cur=cur->next;
        }
        map<int,int>::iterator it;
        for(it=m.begin();it!=m.end();it++)
        {
            if(it->second==1)
            {
                ListNode* newnode=(ListNode*)malloc(sizeof(ListNode));
                newnode->val=it->first;
                newnode->next=NULL;
                tail->next=newnode;
                tail=newnode;
            }
        }
        return res->next;
    }
};

當然如果要刪除表中的重複節點,只保留一個重複節點,那直接用set好了,把鏈表的數據都放入set中,排序+去重,在構建新鏈表,把這些節點都掛起來,和上述方法是一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章