删除有序链表中重复的元素-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;
    }
};