题目链接
设置虚拟头结点dummy不用考虑边界情况,p指针指向的是上一个没有重复的元素的位置,初始位置是dummy,q从p->next开始,一直走到第一个与q->next不同元素的位置,删除中间的即可。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
std::ios::sync_with_stdio(false);
ListNode* dummy = new ListNode(-1);
dummy->next = head;
ListNode* p = dummy;
while(p->next){
ListNode* q = p->next;
while(q && q->val == p->next->val) q = q->next;
if(p->next->next == q) p = p->next;
else p->next = q;
}
auto res = dummy->next;
delete dummy;
return res;
}
};