去除重复元素I
一开始是这么写的:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode *tmp = head;
while(tmp->next){
if(tmp->val == tmp->next->val){
tmp->next = tmp->next->next;
}
tmp = tmp->next;
}
return head;
}
};
然后报错了,仔细一想,这么写的话,若链表末尾的元素是重复的则会出问题(会出现求NULL指针的next),要改成以下形式才行:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head == NULL) return head;
ListNode *p = head;
while(p->next != NULL){
if(p->val != p->next->val){
p = p->next;
}
else{
p->next = p->next->next;
}
}
return head;
}
};
去除重复数字II
此题将重复数字一个不剩地去除,而不像上题还保留一个
非递归的:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (!head || !head->next) return head;
ListNode *dummy = new ListNode(-1), *pre = dummy;
dummy->next = head;
while (pre->next) {
ListNode *cur = pre->next;
while (cur->next && cur->next->val == cur->val) {
cur = cur->next;
}
if (cur != pre->next) pre->next = cur->next;
else pre = pre->next;
}
return dummy->next;
}
};
递归的:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==NULL || head->next==NULL)
return head;
ListNode *p=head->next;
if(p->val!=head->val){
head->next=deleteDuplicates(p);
return head;
}
else{
while(p && p->val==head->val) p=p->next;
return deleteDuplicates(p);
}
}
};