解题思路:
链表中重复元素的删除,因为重复的结点都要删除,所以需要一个前驱结点pre。
因为删除一个结点的基本操作是node->next=node->next->next;(删除node的下一个结点);
我们设置当前结点cur,假如判断当前结点cur与后面几个结点是重复的结点,需要删除,那么可以逐个删除与cur重复的结点,但是我们还需要把cur这个结点也删除,要删除cur这个结点时,没有前驱结点就不好删除了,所以需要pre这个前驱结点。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead) {
ListNode* head=new ListNode(-1);
head->next=pHead;
ListNode* pre=head; //前驱结点
ListNode* cur=pHead;
while(cur&&cur->next){
//假如当前结点的值不等于下一个结点的值,那么pre和cur都往后走
if(cur->val!=cur->next->val){
pre=pre->next;
cur=cur->next;
}else{
//假如cur和cur->next值相等,一值删除结点,直到只剩下cur
//(pre)->(cur)1->1->1-----》(pre)->(cur)1
while(cur&&cur->next&&cur->val==cur->next->val){
cur->next=cur->next->next;
}
//删除cur结点,让pre指向cur的下一个结点
//cur变成下一个结点
pre->next=cur->next;
cur=cur->next;
}
}
return head->next;
// //保留节点
// ListNode* cur=pHead;
// while(cur&&cur->next){
// if(cur->val==cur->next->val)
// cur->next=cur->next->next;
// else
// cur=cur->next;
// }
// return pHead;
}
};