一、设计测试样例

空        『特殊』
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;
    }
};