leetcode 83-Remove Duplicates from Sorted List
题干:
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
解:
方法1:递归法
//方法1:递归法。比较当前head与head->next的val值,若不等,head->next指向原head->next递归返回的头元素;若相等,循环往后比较直到找到与head的val不等的第一个元素p,head->next指向从p开始递归返回的头元素。
ListNode *deleteDuplicates(ListNode *head){
if(!head || !head->next) return head;
if(head->val != head->next->val){
head->next = deleteDuplicates(head->next);
}
else{
ListNode* p = head->next;
while(p && head->val==p->val) {
ListNode* tmp = p;
p = p->next;
delete(tmp);
}
head->next = deleteDuplicates(p);
}
return head;
}
方法2:迭代法
//方法2:迭代法。两个指针prev、cur分别记录当前的和下一个。若prev->val==cur->val,说明重复,删除cur所指向的节点;若不相等,prev后移至cur。
ListNode *deleteDuplicates(ListNode *head){
if(!head) return nullptr;
ListNode* prev = head, *cur = head->next;
while(cur){
if(prev->val == cur->val){
ListNode* tmp = cur;
prev->next = cur->next;
cur = cur->next;
delete(tmp);
}
else {
prev = cur;
cur = cur->next;
}
}
return head;
}
// 更简单的写法,不需要两个指针了
ListNode *deleteDuplicates(ListNode *head){
if(!head) return nullptr;
ListNode* cur = head;
while(cur && cur->next){
if(cur->val == cur->next->val){
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete(tmp);
}
else cur = cur->next;
}
return head;
}