题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路
- 建立三个指针Cur(当前节点),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;
//设置一个trick, 作为头指针, 这样我们无需单独考虑第一个元素
ListNode *first=new ListNode(-1);
first->next=pHead;
ListNode* Pre=first;
ListNode* Cur=pHead;// 指向当前处理的结点
ListNode* Next=NULL;
while(Cur!=NULL&&Cur->next!=NULL){
Next=Cur->next;
if(Cur->val==Next->val){
int tmp=Cur->val;
while(Cur!=NULL&&Cur->val==tmp){
Cur=Cur->next;// 就跳过所有重复的数字
}
Pre->next=Cur;
}
else{
Pre=Cur;
Cur=Cur->next;
}
}
return first->next;
}
};