import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        // write code here
        if(pHead==null){
            return null;
        }
        ListNode head=new ListNode(0);
        head.next=pHead;
        ListNode pre=head;
        ListNode precur;
        while(pre!=null&&pre.next!=null&&pre.next.val<x){
            
            pre=pre.next;//此时pre是在大于等于x的前一个节点
        }

        precur=pre.next;//cur前一个节点(变)
        ListNode large=precur;//记录第一个大于x的节点(不变)
        while(precur!=null&&precur.next!=null){
            ListNode cur=precur.next;
            if(cur.val<x){
                //插入pre后面
                precur.next=cur.next;
                cur.next=large;
                pre.next=cur;
                pre=cur;
            }else{
                precur=precur.next;
            }
        
        }

        return head.next;//我一开始写的是pHead,但是因为pHead也就是头结点(有值)可能发生变化,比如第一个数就大于x,后面有数需要插入到第一个节点之前,这样就不是头结点了。所以应该返回自己设置的空头结点的下一个节点
    }
}