- 题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
- idea:
- 将p赋值为链表头。用prev记录上一个不重复的结点,初试化为NULL
- 假如p的next与p值不等,则将prev赋值为p,若prev为空时表示找到第一个不重复的结点因此要将pHead赋值为p。
- 如果p的next不存在,直接结束循环
- 如果p的next的值与p的值相等,则删除p,直到找到下一个不等的p或者走到尽头
- 最后千千万万要记得将最后一个不重复的结点prev的next赋值为NULL
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if (!pHead) return NULL;
ListNode *prev = NULL, *p = pHead;
ListNode *del;
pHead = NULL;
while(p){
if (!p->next || p->next->val != p->val){
if (prev)
prev->next = p;
else{
pHead = p;
}
prev = p;
p = p->next;
continue;
}
int val = p->val;
while(p&&p->val == val){
del = p;
p = p->next;
free(del);
}
}
if (prev) prev->next = NULL;
return pHead;
}
};