刪除鏈表中的重複節點(不保留重複節點)
(劍指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中,排序+去重,在構建新鏈表,把這些節點都掛起來,和上述方法是一樣的。