删除链表中重复的节点
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
解题思路
- 这题是不保留重复的节点,另一个相似的题目是只去重
pre
指向前一个不重复的节点,一旦发现有重复的节点,让p
指向重复的第一个节点,q
指向重复的最后一个节点。让pre->next=q->next
来摘除重复的那段节点。- 要注意当重复的那段节点从链表头节点开始时,要更新头节点
pHead=q->next
。
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead==NULL) return pHead;
ListNode *pre=NULL,*p=pHead;
ListNode *q=NULL;
while(p!=NULL&&p->next!=NULL){
if(p->val!=p->next->val){
pre=p;
p=p->next;
}else{
q=p->next;
//让q指向要删除的最后一个重复元素
while(q!=NULL&&q->next!=NULL&&q->next->val==p->val)
q=q->next;
if(p==pHead){
pHead=q->next;
}else{
//把重复的这一段节点都摘掉
pre->next=q->next;
}
p=q->next;
}
}
return pHead;
}
};