居然是所有的重复元素都要删除,那么检查每个结点时自然需要站在其前一个的视角,因此我们首先创建一个哑结点。

对于任何结点,检查它是否和它的下一个数值相等,相等的话这一整条都跳过,不更新链表。

不相等的话更新prev即可。

记住每次让正在构建的链表尾部指向空,因为只是单纯指向一个结点的话,它后续的结点也会一起带过来。

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode dummy(0);
        ListNode* prev = &dummy;
        while (head) {
            bool f=false;
            while (head->next&&head->next->val ==head->val) {
                f=true;
                head=head->next;
            }
            if (!f) {
                prev->next=head;
                prev=head;
            }
            head=head->next;
            prev->next =nullptr;
        }
        return dummy.next;
    }
};