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; } }