对于一个链表,我们需要用一个特定阈值完成对它的分化,使得小于等于这个值的结点移到前面,大于该值的结点在后面,同时保证两类结点内部的位置关系不变。
如特定值val,把链表遍历,小于等于val的生成一个链表,大于的生成一个链表
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Divide {
public ListNode listDivide(ListNode head, int val) {
// write code here
if(head==null||head.next==null)
{
return head;
}
//小于部分
ListNode sh = null;
ListNode st = null;
//大于部分
ListNode bh = null;
ListNode bt = null;
ListNode next = null;
ListNode p = head;
while(p!=null)
{
next = p.next;
p.next = null;
if(p.val<=val)
{
if(sh==null)//sh和st实际上为引用,对其操作的效果相同
{
sh = p;
st = p;
}else
{
st.next = p;
st = p;
}
}else{
if(bh==null)
{
bh = p;
bt = p;
}else
{
bt.next = p;
bt = p;
}
}
p = next;
}
if(st!=null)
{
st.next = bh;
}
return sh!=null?sh:bh;
}
}