首先看一下题目,
和上次的题做一下对比,【手绘漫画】图解LeetCode之删除排序链表中的重复元素(LeetCode 83题)
嗯,都是删除节点,不过这次要求删除所有的节点,比如 3 重复了,那么所有的 3 都没了~
好了,废话少说,开始了。
3、正文
好了,来一起看一下。
双指针,如果 q
指向的元素与 p
的下一个节点的元素相同,q
接着走,如果下一个还相同,那么说明遇到了重复元素。
如果这段相同的元素,个数多于一个,则整段元素直接删除,否则说明只有一个,没毛病。
4、代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
auto dummy=new ListNode(-1);
dummy->next=head;
auto p=dummy;
while(p->next){
auto 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;
}
return dummy->next;
}
};