一、设计测试样例
空 『特殊』
1 『特殊』
11111 『特殊』
12311 『特殊』
11234 『特殊』
11233 『常规样例』
二、编码的坑-对应上面的测试样例
- 我们主要管『常规样例』的逻辑,但是不能忽视『特殊样例』的逻辑
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead) {
//对抗2个样例,空和1
if( nullptr==pHead || nullptr==(pHead->next) )
{
return pHead;
}
ListNode * ret=new ListNode(-1);
ret->next=pHead;
ListNode * pre=ret;//前一个节点
ListNode * Left=pHead;
ListNode * Right=pHead->next;
while( nullptr!=Right )
{
if( Left->val == Right->val )
{
Right=Right->next;
}
else if( Left->val !=Right->val )
{
if( Left->next!=Right )
{
//Leftz追随Right
while( Left!=Right )
{
ListNode * del=Left;
Left=Left->next;
delete del;
}
pre->next=Right;
Right=Right->next;
}
else if( Left->next==Right )
{
pre=pre->next;
Left=Left->next;
Right=Right->next;
}
}
}
//对抗1个样例,1111『这个地方,算是特判』
if( Left->next!=Right )
{
//Leftz追随Right
while( Left!=Right )
{
ListNode * del=Left;
Left=Left->next;
delete del;
}
pre->next=Right;
//这个时候,Righr不用管了,因为可能是nullpre Right=Right->next;
}
ListNode * del=ret;
ret=ret->next;
delete del;
return ret;
}
};