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.
Subscribe to see which companies asked this question
gg在头节点改了很久 因为会出现[1,1,2,2,3]的情况
一:
/**
* 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==NULL) return head;
bool isdup=false;
while(1){
isdup=false;
while(head!=NULL && head->next!=NULL){
if(head->val==head->next->val){
head->next=head->next->next;
isdup=true;
}
else{
break;
}
}
if(isdup) head=head->next;
else break;
}
if(head==NULL || head->next==NULL) {
return head;
}
ListNode *rf=head;
ListNode *r=rf->next;
ListNode *rc=rf->next->next;
isdup=false;
while(rf!=NULL && r!=NULL && rc!=NULL){
if(r->val==rc->val){
isdup=true;
r->next=rc->next;
rc=r->next;
}
else{
if(isdup){
rf->next=rc;
r=rf->next;
rc=r->next;
isdup=false;
}
else{
rf=rf->next;
r=rf->next;
isdup=false;
rc=r->next;
}
}
}
if(isdup) rf->next=NULL;
//cout<<"isdup="<<isdup<<endl;
return head;
}
};
二:
学习别人的,发现可以在头结点前加个结点,就可以一起处理了
学习了~
/**
* 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==NULL) return head;
ListNode *p = new ListNode(-1);
p->next = head;
ListNode *rf=p;
ListNode *r=rf->next;
ListNode *rc=rf->next->next;
bool isdup=false;
while(rf!=NULL && r!=NULL && rc!=NULL){
if(r->val==rc->val){
isdup=true;
r->next=rc->next;
rc=r->next;
}
else{
if(isdup){
rf->next=rc;
r=rf->next;
rc=r->next;
isdup=false;
}
else{
rf=rf->next;
r=rf->next;
isdup=false;
rc=r->next;
}
}
}
if(isdup) rf->next=NULL;
//cout<<"isdup="<<isdup<<endl;
return p->next;
}
};