需要注意下,重复的数字可能是首字符,所在在开头增加一个空结点。
#include<iostream>
using namespace std;
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if(!pHead)
return pHead;
int val = 0;
ListNode * pFirst = new ListNode(val);
pFirst->next = pHead;
ListNode * pre = pFirst;
pre->next = pHead;
ListNode * p = pHead;
while(p && p->next){
if(p->val == p->next->val){
while(p->next && (p->val == p->next->val))
{
p = p->next;
}
//删除重复的结点,利用前驱结点删除后继结点,一直删除到p结点之前,考虑p节点可能在末尾
while(pre->next!=p){
ListNode* tmp = pre->next;
pre->next = pre->next->next;
delete tmp;
}
//删除p节点
ListNode * tmp = pre->next;
pre->next = pre->next->next;
delete tmp;
p = pre->next;//不能用p->next因为p已经被删了
}
else{ //相邻两个节点不相同
//pre->next = p;
pre = pre->next;
p = p->next;
}
}
return pFirst->next;
}
};
int main(){
ListNode *pHead = new ListNode(1);
pHead->next = new ListNode(2);
pHead->next->next = new ListNode(3);
pHead->next->next->next = new ListNode(3);
pHead->next->next->next->next = new ListNode(4);
Solution s;
ListNode * result=s.deleteDuplication(pHead);
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容