给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1 \to 2\to 3\to 3\to 4\to 4\to51→2→3→3→4→4→5, 返回1\to 2\to51→2→5.
给出的链表为1\to1 \to 1\to 2 \to 31→1→1→2→3, 返回2\to 32→3.
链表的题都不难,不涉及什么特别复杂的算法,主要就是想明白,交替的过程。
只需在最前面设置一个pre,前面两个指针找重复的,如果p,q的val相等,则q一直向前,直到不相等,然后我们将pre的next指向q,在更新一下p,q位置即可;如果p,q的val不相等,则将所有指针移动一次即可。当然这一切都要保证指针所在处不为nullptr。
ListNode* deleteDuplicates(ListNode* head) {
// write code here
if(!head) return nullptr;
ListNode* dummy = new ListNode(-1),* pre = dummy,* p = head,* q = head->next;
dummy->next = head;
while(q) {
if(p->val == q->val) {
while(q && q->val == p->val) q = q->next;
pre->next = q;
p = q;
if(p) q = p->next;
}
else {
pre = pre->next;
p = p->next;
q = q->next;
}
}
return dummy->next;
}