注意两点:
- 链表可能从开头就是重复项,所以要新建头节点,最后返回新头的next。
- 处理最后消除的元素是重复项的情况
class Solution
{
public:
ListNode *deleteDuplicates(ListNode *head)
{
/*
Input: 1->1->1->2->3
Output: 2->3
*/
ListNode dummy = ListNode(-1);
dummy.next = head;
ListNode *cur = dummy.next;
ListNode *pre = &dummy;
while (cur)
{
// 处理重复元素
bool isDuplicate = false;
while (cur->next && cur->val == cur->next->val)
{
isDuplicate = true;
ListNode *temp = cur;
cur = cur->next;
delete temp;
}
// 删掉最后一个重复的元素
if (isDuplicate)
{
ListNode *temp = cur;
cur = cur->next;
delete temp;
}
// 处理非重复元素
else{
pre->next = cur;
pre = pre->next;
cur = cur->next;
}
}
pre->next = nullptr;
return dummy.next;
}
};