/**
 * struct ListNode {
 *    int val;
 *    struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param x int整型 
     * @return ListNode类
     */
    ListNode* partition(ListNode* head, int x) {
        // write code here
        //思路:小于x的元素翻转到前面 自然大于x元素后面( 1)
        //细节1:原始相对顺序 ->基本操作:链表tail插入
        //细节2:如果小x,并且相对顺序已经正确(在同一个位置删除,和插入)等于不变
        //-->三个指针移动
        //细节3:分割后 head 可能发生变化 ,也可能没有发生变化 需要nedd

         if (nullptr == head || nullptr ==head->next)
         {
             return head;
         }

         ListNode myhead(-1);//基本操作:构造一个固定不变头节点
         myhead.next =head;

        ListNode* ptail = &myhead;
        ListNode* pcur = head;//从第一个元素开始。第一个元素大小不确定.
        ListNode* ppre = &myhead;


        //基本操作:遍历链表  pcur++
          //head-> 5(pcr ) 4 3 2 1 x=2
         while(pcur)
         {
             if (pcur->val >= x)
             {
                  ppre = pcur;
                  pcur = pcur->next;
             }else if (pcur ==ptail->next) //基本操作:else :上上面相反的情况
             {   
                  ptail= ptail->next;
                  ppre = pcur;
                  pcur = pcur->next;
             }else
             {
                 ppre->next = pcur->next;
                 pcur->next = ptail->next;
                 ptail->next = pcur;

                 ptail = pcur;

                 pcur = ppre->next;
             }
         }


        return myhead.next;

    }
};