全程图示详解:
题目链接:分割链表
完整代码如下:
/**
* 链表分割,以给定的值x将链表分为两个部分,比x小的在前面,比x大的在后面
* @return
*/
public ListNode partition(int x){
if(head == null){
return null;
}
//定义cur节点,指向链表的头部
ListNode cur = head;
ListNode bs = null;
ListNode be = null;
ListNode as = null;
ListNode ae = null;
//使用cur遍历所有节点
while(cur != null){
if(cur.val < x){
if(bs == null){//前一部分链表第一次尾插节点
bs = cur;
be = cur;
}else{
be.next = cur;
be = be.next;
}
}else{
if(as == null){//后一部分链表第一次尾插节点
as = cur;
ae = cur;
}else{
ae.next = cur;
ae = ae.next;
}
}
cur = cur.next; //处理下一个节点
}
if(bs == null){//对应特殊情况2,即原始节点每个节点的val值都 >= x
return as;
}
if(as != null){//对应特殊情况4,原始节点的val有>= x的,但是最后一个节点的val < x
ae.next = null;
}
be.next = as; //前后两部分链表链接
return bs;
}
OJ上运行结果如图:
画图码字不易,以此记录。