和 删除有序链表中重复的元素-I 的思路是类似的,这道题目是将重复出现元素全部删掉(包括自己),那么就需要存储第一个重复节点前一个位置指针 p 用于删除。
用 a 指针遍历链表,b = a->next
只要 a 和 a->next 不为空则进行循环,b = a->next
- 如果
b 不为空且 a->val == b->val
那么 b 就往后移动,直到a->val != b->val
为止,将 a 重复的一段找出来。 - 如果
a->next != b
说明 a 是重复出现的元素,那么就将 [a, b) 之间的元素全部删掉,即p->next = b
,同时a = b
继续遍历 - 否则
a->next == b
说明 a 不是重复出现的元素,那么 p 往后移,a 往后移p = p->next, a = a->next
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* deleteDuplicates(ListNode* head) {
if (!head || !head->next) return head;
auto dummy = new ListNode(-1);
dummy->next = head;
auto p = dummy, a = p->next;
while (a && a->next) {
auto b = a->next;
while (b && a->val == b->val) b = b->next;
if (a->next != b) {
p->next = b;
a = b;
} else {
p = p->next;
a = a->next;
}
}
return dummy->next;
}
};