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.
s思路:
1. 方法1:自己晕晕乎乎写的,思路很琐碎。
2. 方法1修正了一下:用两个指针pre和pnow,用dummy防止头指针修改。方法是:先做实验判断是否有duplicates,根据pnow和pnow->next是否相等,如果等,则while把所有相等的pass掉;然后比较pre->next和pnow:相等,说明pnow没有移动,没有重复,则:pre往后移动;不等,说明pnow移动过,有重复,则pre->next=pnow->next;表示:跳过pnow指向的数!
3. 这道题,设计的指针操作两个:指针移位,不修改链表;指针next修改,修改链表!
2. 方法2:参考之前写的。用pointer-to-pointer。关键是如何检测到duplicate.即:如果当前和下一个相等,则用一个while循环把相等的都给跳过,当不相等时,则直接移位!
//方法1:做得很差!
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
//
ListNode* dummy=new ListNode(INT_MIN);
dummy->next=head;
//head=dummy;
ListNode* pre=dummy,*cur=head;
bool repeat=0;
while(cur){
cur=cur->next;
if(pre->next!=cur){
if(cur&&pre->next->val==cur->val){
repeat=1;
}else{
if(repeat==1){
pre->next=cur;
repeat=0;
}else
pre=pre->next;
}
}
}
return dummy->next;
}
};
//方法1:修改优化后。利用pre和pnow关系,判断是否有重复!
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
//
ListNode* dummy=new ListNode(INT_MIN);
dummy->next=head;
ListNode* pre=dummy,*pnow=head;
while(pnow){
while(pnow->next&&pnow->val==pnow->next->val)//跳过重复的地方
pnow=pnow->next;
if(pnow==pre->next){//没用重复
pre=pnow;
}else{//有重复
pre->next=pnow->next;
}
pnow=pnow->next;
}
return dummy->next;
}
};
//方法2:p2p 太简洁了!用到两种pointer to pointer操作。即:移动指针,修改指针;修改指针指向的位置的值
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
//
ListNode**p=&head;
while((*p)){
int cur=(*p)->val;
if((*p)->next&&cur==(*p)->next->val){
while(*p&&cur==(*p)->val)
*p=(*p)->next;//修改指针指向位置的值,修改链表链接关系
}else
p=&((*p)->next);//移动指针,不修改链表!
}
return head;
}
};