这类题目虽然不难,但是要一次性调通感觉不容易。还是要多练习。
我的方法是加个dummyHead。看到有的方法是用双指针,并且不用dummyHead,下次学习一下。
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* deleteDuplicates(ListNode* head) {
ListNode dummyNode(0); //pos is the place that
ListNode* prePos = &dummyNode;
prePos->next=head;
ListNode* node=head;
while(node && node->next) {
if (node->val==node->next->val) {
while(node && node->next && (node->val==node->next->val))
node->next=node->next->next;
prePos->next=node->next;
node=node->next;
}
else{
prePos=node;
node=node->next;
}
}
return dummyNode.next;
}
int main()
{
ListNode a(1), b(1), c(2);
a.next=&b;
b.next=&c;
c.next=NULL;
ListNode *d=deleteDuplicates(&a);
while(d) {
cout<<d->val<<" ";
d=d->next;
}
cout<<endl;
cout<<"~~~~~"<<endl;
ListNode aa(1), bb(1), cc(2), dd(3), ee(3);
aa.next=&bb;
bb.next=&cc;
cc.next=ⅆ
dd.next=ⅇ
ListNode *ff=deleteDuplicates(&aa);
while(ff) {
cout<<ff->val<<" ";
ff=ff->next;
}
cout<<endl;
cout<<"~~~~~"<<endl;
ListNode aaa(1), bbb(1), ccc(1);
aaa.next=&bbb;
bbb.next=&ccc;
c.next=NULL;
ListNode *ddd=deleteDuplicates(&aaa);
while(ddd) {
cout<<ddd->val<<" ";
ddd=ddd->next;
}
cout<<endl;
cout<<"~~~~~"<<endl;
ListNode aaaa(1), bbbb(1), cccc(2), dddd(2);
aaaa.next=&bbbb;
bbbb.next=&cccc;
cccc.next=&dddd;
dddd.next=NULL;
ListNode *eeee=deleteDuplicates(&aaaa);
while(eeee) {
cout<<eeee->val<<" ";
eeee=eeee->next;
}
cout<<endl;
return 0;
}