题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead==nullptr || pHead->next==nullptr)
return pHead;
ListNode *prev = nullptr;
ListNode *p = pHead;
ListNode *q = nullptr;
while(p != nullptr){
q = p->next;
if(q!=nullptr && p->val==q->val){
while(q!=nullptr && p->val==q->val){
q = q->next;
}
if(p==pHead){//注意链首节点重复时,head指针要重新赋值
while(p!=q){//将重重节点释放
ListNode *temp = p;
p = p->next;
delete temp;
temp = nullptr;
}
pHead = q;
p = q;
}else{
while(p!=q){
ListNode *temp = p;
p = p->next;
delete temp;
temp = nullptr;
}
prev->next = q;
p = q;
}
}else{
prev = p;
p = p->next;
}
}
return pHead;
}
};