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.
方法一:这一题相比上一题的操作复杂很多,看起来就是多删除一个链表元素,但是实现起来并不容易。这里用到了一个指向变量的指针,当头指针移动的时候,用该指针记录头指针的位置。其余操作类似于上一题。
/**
* 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) {
ListNode *root;
ListNode **ppNext;
ppNext=&root;
while(head){
if(head->next==NULL||head->next->val!=head->val){
*ppNext=head;
ppNext=&(head->next);
head=head->next;
}
else{
int val=head->val;
head=head->next;
while(head&&head->val==val){
head=head->next;
}
}
}
*ppNext=NULL;
return root;
}
};
方法二:三个指针pre,cur,next.
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if(!pHead||!pHead->next) return pHead;
ListNode *dummy=new ListNode(0);
dummy->next=pHead;
ListNode *pre=dummy;
ListNode *cur=pHead;
ListNode *next=NULL;
while(cur&&cur->next){
next=cur->next;
if(cur->val==next->val){
while(next&&cur->val==next->val){
next=next->next;
}
pre->next=next;
cur=next;
}
else{
pre=cur;
cur=cur->next;
}
}
return dummy->next;
}
};