Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given 1->2->3->3->4->4->5
, return 1->2->5
.
Given 1->1->1->2->3
, return 2->3
.
前一段时间做这道题目的时候,思路是找到数字重复出现的start和end节点,把这一段的节点全部删掉,今天又重新做了,觉得可以使用last节点表示访问过的节点的值,并且用一个计数器计算出现的次数,如果次数大于1,就扔掉好了。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head)
return NULL;
ListNode* last=NULL;//表示上次访问的节点
int cnt=0;//上次访问的数字出现的次数
ListNode*p, *h;
p=head;
h=NULL;
ListNode*tail=NULL;
while(p){
ListNode* next=p->next;
p->next=NULL;
if(last==NULL){//第一个节点
last=p;
cnt=1;
}else if(p->val!=last->val){
if(cnt==1){//只出现1次,不重复
if(!h){
h=last;
tail=h;
}else{
tail->next=last;
tail=tail->next;
}
last=p;//更新last
cnt=1;
}else{
last=p;//last的值多次出现,重复的数字要扔掉,last换成新值
cnt=1;
}
}else{//p->val==s.top()->val
cnt++;//计算重复的次数
}
p=next;
}
if(cnt==1){//别忘了最后的节点
if(!h){
h=last;
}else{
tail->next=last;
}
}
return h;
}
};