给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 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 fake(-1);
fake.next=head;
head=&fake; // 新建立头结点
ListNode*tail =head;
bool dup= false; // 指示是否存在重复值
for(ListNode* p =head->next;p&&p->next;p=p->next){
if(dup==false&& p->val==p->next->val){
dup=true;
continue;
} // 前面没重复,现在出现重复,将dup设为true
if(dup==true&&p->val!=p->next->val){
dup=false;
tail->next=p->next;
continue;
} // 前面出现重复,删除。
if(dup==false){
tail=p;
} // 没有重复,tail向后移动,p也向后移动
// 3个if,3种情形,剩下一种:出现3个重复,直接移动p
}
if(dup==true){
tail->next=NULL;
} // 全部是重复,直接为空
return head->next;
}
};
思路:出现重复的,继续往后走,走到没重复的,删除操作。
注意全部重复和全部不重复的情况
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode fake(-1);
fake.next=head;
head=&fake;
ListNode *tail=head;
bool dup=false;
for(ListNode* p=head->next;p&&p->next;p=p->next){
if(dup==false && p->val==p->next->val){
dup=true;
continue;
} // 遇到第一个重复值,p继续往后走
if(dup==true && p->val==p->next->val)
continue; // 遇到第二个重复值,p继续往后走
if(dup==true && p->val!=p->next->val){
dup=false;
tail->next=p->next;
continue;
} // 前面出现重复,遇到不重复的,删除前面重复
if(dup==false){
tail=p;
} // 不重复,tail往后走
}
if(dup==true){
tail->next=NULL;
} // 都重复,空链
return head->next;
}
};
网友评论