图片说明

搜索 微信公共号:offer 多多


class Solution3 {
public:
    /**
     * 
     * @param head ListNode类 
     * @param x int整型 
     * @return ListNode类
     */
    ListNode* partition(ListNode* phead, int x) {
        // write code here

        //01 
        if (nullptr == phead || nullptr == phead->next)
        {
            return phead;
        }

        //02 返回结果 如果head小于k 返回结果就是head,大于则不是,不确定因此 why
        ListNode myhead(-1);
        myhead.next = phead;
        ListNode* ptail = &myhead;

       //03 
       ListNode* pcur =phead; // 第一个节点大小不确定,无法默认就是分割好的(反转,奇偶 插入排序)
       ListNode* ppre =&myhead;

       while(pcur)
       {

         if(pcur->val >= x)
         {   ////case 1 移动
             ppre = pcur ;
             pcur = pcur->next;//i++
         }else if (ptail->next == pcur)
         {  //bug1  ptail->next = pcur
             //case 2移动
             ptail = ptail->next;//move
             ppre = pcur ;
             pcur = pcur->next;//i++

         }else
         {
            //case3 反转
            ppre->next = pcur->next;
            pcur->next =ptail->next;
            ptail->next = pcur;
            ptail = pcur;//move

            pcur = ppre->next;


         }

       }
        return myhead.next;
    }

};

//g++ -std=c++11 tag_list_01.cpp
int main()
{   
    //vector<int> test={1,2,3,4,5};
    vector<int> test={5,4,3,2,1};
    ListNode* pInput= createList(test);
    cout<< "input: " ;
    show(pInput);

   Solution3 s3;
   ListNode* pOnput=s3.partition(pInput,3);
    cout<< "outut: " ;
    show(pOnput);

    return 0; 
}