82. 删除排序链表中的重复元素 II - 力扣(LeetCode)
使用哨兵节点简化处理:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head) return head;
auto dummy = new ListNode(-1);
dummy->next = head;
auto p = dummy, cur = head;
while(cur && cur->next){
int flag = 0;
while(cur->next && cur->val == cur->next->val){
flag = 1;//置位,表示有相同的值,需要删除
cur = cur->next;
}
if(flag == 0) p = cur;
else p->next = cur->next;
cur = cur->next;
}
return dummy->next;
}
};
优化一下代码;
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head || !head->next) return head;
auto dummy = new ListNode(-1);
dummy->next = head;
auto pre = dummy, cur = head;
while(cur && cur->next){
if(cur->val != cur->next->val){
pre = cur;
cur = cur->next;
}else{
while(cur->next && cur->val == cur->next->val){
cur = cur->next;
}
pre->next = cur->next;
cur = cur->next;
}
}
return dummy->next;
}
};
如果不使用哨兵节点:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head || !head->next) return head;
bool flag = false;//用于标记head是否要去掉
while(head->next && head->val == head->next->val){
flag = true;
head = head->next;
}
auto p = head, cur = head;
while(cur && cur->next){
if(cur->val != cur->next->val){
p = cur;
cur = cur->next;
}else{
while(cur->next && cur->val == cur->next->val){
cur = cur->next;
}
p->next = cur->next;
cur = cur->next;
}
}
return flag == true ? head->next : head;
}
};
也可以使用递归或者哈希表处理
- head 后面有值而且和 head 的值相等,那么就找到不相等为止,然后对后面一个结点去递归,这样就把前面重复的给删除了。
- head 后面有值但和 head 的值不等,那么就递归后面一个结点,接在 head 的后面
递归不用使用哨兵节点
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head || !head->next) return head;
if(head->val == head->next->val){
while(head->next && head->val == head->next->val){
head = head->next;
}
return deleteDuplicates(head->next);
}
else head->next = deleteDuplicates(head->next);
return head;
}
};