题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
//用两个指针,prePtr和curPtr,需要注意的是,有可能第一个结点和第二个结点的值
//一样,此时由于ListNode* curPtr=pHead->next,*prePtr=pHead;会造成第一个结点没
//删除掉,所以需要标记一下,用flag2,如果第一个结点和第二个结点相等,则flag2
//置为true
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
//为空和一个结点直接返回
if(pHead==NULL)return NULL;
if(pHead->next==NULL)return pHead;
//flag用来标记preValue的值是否有效,flag2用来标记是否需要删除第一个结点
bool flag=false,flag2=false;
int preValue=0;
ListNode* curPtr=pHead->next,*prePtr=pHead;
//判断第一个结点和第二个结点是否相等
if(pHead->val==pHead->next->val)
{
flag=true;
flag2=true;
preValue=pHead->val;
}
//分两种情况,preValue值有效时,和preValue值无效时
while(curPtr!=NULL)
{
if(flag==false)
{
if(curPtr->next==NULL)break;
else
{
if(curPtr->val==curPtr->next->val)
{
prePtr->next=curPtr->next->next;
preValue=curPtr->val;
delete curPtr->next;
delete curPtr;
curPtr=prePtr->next;
flag=true;
}
else
{
curPtr=curPtr->next;
prePtr=prePtr->next;
}
}
}
else
{
if(preValue==curPtr->val)
{
prePtr->next=curPtr->next;
delete curPtr;
curPtr=prePtr->next;
}
else
{
flag=false;
}
}
}
if(flag2==false)return pHead;
else
{
auto p=pHead->next;
delete pHead;
return p;
}
}
};