『测试样例设计的重要性』三指针/双指针+哨兵
删除链表中重复的结点
http://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
一、设计测试样例
空 『特殊』 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; } };