删除链表中重复放入结点
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
[ 在线OJ ]
- last指向去重后的最后一个元素
- first还未去重部分的第一个元素
- fina指向first的下一个,指向重复元素结尾的下一个元素
- 从链表头开始,寻找第一个非重复元素,即fina的位置,如果发现第一个元素重复,直接删除fina前的所有元素,pHead指向fina,如图Step1和2
- 如果发现中间的重复结点last->next = fina,删除中间重复的结点,如图Step3
例如:
第一步和第二步的指针情况
注意:删除重复结点,避免内存泄露
/*
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* last = pHead;
ListNode* first = pHead;
ListNode* fina = pHead;
ListNode* tmp = pHead;
while(last!=NULL&&last->next!=NULL){
first = last->next;
fina = first->next;
//找到重复结点,直到fina与该元素不相同
while(fina!=NULL&&first->val==fina->val){
tmp = fina;
fina = fina->next;
delete tmp;
}
//第一个结点重复 1 1 ..
if(last->val==first->val){
tmp = pHead;
pHead=fina;
last = fina;
delete tmp;
}else{
//有重复结点,需要删除结点
if(first->next!=fina){
last->next = fina;
delete first;
}
//没有重复结点
else
last = last->next;
}
}
return pHead;
}
};