import java.util.*;

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

    ListNode(int val) {
        this.val = val;
    }
    将链表分割为两个,定义四个节点 bs,be,as,ae分别表示两段链表的头和尾
    本题可以采用,将小于x的节点头插到前面一段链表中,大于的放在后一段。但是需要考虑是否存在大于x的节点和小于x的节点。
}*/
public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        // write code here
        ListNode bs = null;
        ListNode be = null;
        ListNode as = null;
        ListNode ae = null;

        ListNode cur = pHead;
        while (cur != null) {
		  //小于插到前一段
            if(cur.val < x) {
			  //为空时,为bs、be赋值指向cur。
                if(bs == null) {
                    bs = cur;
                    be = cur;
                }else {
				  //不为空时插入be后面
                    be.next = cur;
                    be = be.next;
                }
			  //大于插入后一段
            }else {  
			为空时,为as、ae赋值指向cur。
                if(as == null) {
                    as = cur;
                    ae = cur;
                }else {
				  //插入ae后面
                    ae.next = cur;
                    ae = ae.next;
                }
            }
            cur = cur.next;
        }
        // 有可能不会同时存在小于x 和 大于等于x 的数据
	  //不存在小于的时候,不能直接 be.next = as;
        if(bs == null) {
            return as;
        }
        //第一段不为空,连接起来(第二段为空不影响)
        be.next = as;
        //第2个段为空不为空的问题,加if判断为不为空,不能1直接将ae.next置空以免空指针异常
        if(as != null) {
            ae.next = null;
        }
        return bs;
        
    }
}