删除链表中重复的节点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思想:首先这是一个排序的链表 ,也就是说,删完的节点,后面不会再出现。这一点很重要。其次,要删除当前节点,就要知道上一个节点,让上一个prev节点的next指向当前节点的下一个,从而达到把这个节点拿出链表,再删除。那么怎么判断这个节点是不是该删呢。这个节点和下一个节点相同,那么就删除该节点。但是这个判断条件,必然会留下最后一个节点删不掉。所以我们采用一个变量来存储这个要被删除变量的值,虽然这个节点被删掉了,但是如果下一个节点和该节点的值相同,同样删去即可。这里有一个特殊情况,所有的都一样,所以我们要单独判断一下头,不然虽然删了值,但是phead还指向,是个野指针啊,因为我们在判断时,是那当前位后它的下一个比较是否相同,所以while条件是next不能为NULL,那么最后一位也需要我们特殊处理。
/*
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 pHead;
ListNode *cur = pHead;
ListNode *prev = pHead;
int count;
while(cur->next!= NULL){
if(cur->val == cur->next->val || cur->val == count){
if(cur == pHead){
count = cur->val;
pHead = cur->next;
delete cur;
cur = pHead;
}
else{
count = cur->val;
prev->next = cur->next;
delete cur;
cur = prev->next;
}
}
else{
prev = cur;
cur=cur->next;
}
}
if(pHead->val == count)
return NULL;
if(cur->val == count)
{
prev->next = NULL;
delete cur;
}
return pHead;
}
};