题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
这个题目首先考虑到头结点也可能是重复的节点,所以需要设置一个头结点之前的节点。之后需要3个指针
pre,cur和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||pHead->next==NULL) //判断是否是空节点或者只有一个节点
return pHead;
ListNode* prehead=new ListNode(0); //设置头前节点
prehead->next=pHead;
ListNode* pre=prehead;
ListNode* cur=pre->next;
ListNode* next=cur->next;
while(cur!=NULL&&next!=NULL) //如果当前节点或者next节点为空跳出循环
{
if(cur->val==next->val){ //如果出现重复节点一直向后找到以一个cur不等于next的节点
while(next!=NULL&&cur->val==next->val)
{
cur=cur->next;
next=next->next;
}
if(next==NULL)
cur=NULL;
else //注意此时cur节点也是需要删除的节点,所以令cur=next;并且需要再次进行判断是否与后面的重复。
cur=next;
next=next->next;
}
else //如果不出现重复则将pre和cur链接,并且pre和cur和next分别向后移动,注意边界。
{
pre->next=cur;
pre=cur;
cur=next;
if(next!=NULL)
next=next->next;
}
}
pre->next=cur; //最后需要将pre和cur链接起来,对于上面的判断条件,最后一步没有链接起来。
return prehead->next;
}
};