class Solution { public: ListNode* deleteDuplicates(ListNode* head) { ListNode* res = new ListNode(0); //省去判断链表头重复的情况 res->next = head; ListNode *pre = res, *cur = head; //记录前一个没重复的节点和当前节点 while(cur && cur->next) { //后面元素少于2个则不会重复 bool repeat = 0; //是否重复标志位 while(cur->next && cur->next->val == pre->next->val) { //存在下一节点并且下一节点的值与pre后面的值(即接下来要判断是否重复的节点值)相同时 repeat = 1; //设置标志位 cur = cur->next; //当前节点前移直到重复节点的末尾 } if(repeat) pre->next = cur->next; //当有重复时前一个没重复的节点指向末尾重复节点的下一位(可能为空指针) else pre = cur; //否则没重复节点前移 cur = cur->next; //当前节点前移 } return res->next; } };