先创建一个哑结点,用prev指针指向它,方便后续操作。如果head有下一个结点,且二者值相同,我们就一直往后走,出来之后head指向下一个,prev的下一个暂时指向空,如果这个过程没有发生,说明这个值没有重复,prev的下一个指向head,prev更新为head。

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;

    }

};