题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
分析:如果链表为空,返回空(鲁棒稳定性);
设置两个指针,分别指向当前处理对象与上一个对象;设置一个标识符(should_delete),当出现重复节点时将标识符置为true,否则为false;后面将通过标识符判断执行的步骤
当没有重复节点时,将cur和pre向前移动一位;有重复节点时,设置pNext指向cur下一个对象,删除cur,并令cur指向pNext,直到删除所有的重复节点,如果重复节点在开头,pHead此时被删除,重新令现在的cur指向的对象为pHead,对于中间的重复节点,令pre->next指向当前值(连接断裂的链)
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead==NULL) return NULL;
ListNode *cur=pHead,*pre=NULL;
while(cur)
{
bool should_delete=false;
if(cur->next && cur->val==cur->next->val)
should_delete=true;
if(!should_delete)
{
pre=cur;
cur=cur->next;
}
else
{
int val=cur->val;
ListNode *pNext;
while(cur && cur->val==val)
{
pNext=cur->next;
delete cur;
cur=pNext;
}
if(pre==NULL)
pHead=cur;
else
pre->next=cur;
}
}
return pHead;
}
};