删除链表中重复的结点_牛客题霸_牛客网 (nowcoder.com)
class Solution {
public:
ListNode* deleteDuplication(ListNode* head) {
auto dummy = new ListNode(-1); //建立虚拟头结点
dummy->next = head;//虚拟头结点指向头结点
auto p = dummy;
while(p->next) //p的下一个节点不为空 为空就是构建好了可以退出
{ //一次循环处理一段重复节点区段(注意是按区段处理)
auto q = p->next; //q为当前p的下一个节点
//q的下一个节点不为空,且 q的下一个节点的值等于p的下一个节点的值 说明重复 一直走到下一个区段就行啦
while(q->next && q->next->val == p->next->val) q= q->next;
//如果q是p的下一个节点 说明就没有走上面的while循环, 也就是这个点是不重复的,p移动到q
if(q == p->next) p = q;
//如果不是说明存在重复元素,则p指向q的下一个节点 即后面要处理下一区段
else p->next = q->next;
}
return dummy->next;
}
};