将单向链表按某值划分成左边小.中点相等,右边大的形式.
链表问题还是可以有两种解法:(使用容器和不使用容器)
1) 把链表放入数组中,在数组上做patition(使用容器)
public static Node patition(Node head,int num){
if(head==null || head.next==null){
return head;
}
List<Node> list = new ArrayList<>();
Node cur = head;
while(cur!=null){
list.add(cur);
cur = cur.next;
}
int index = 0;
int lessL = -1;
int moreR = list.size();
while(index<moreR){
if(list.get(index).val<num){
swap(list,index++,++lessL);
}else if(list.get(index).val>num){
swap(list,index,--moreR);
}else{
index++;
}
}
for(int i = 1;i<list.size();i++){
list.get(i-1).next = list.get(i);
}
return list.get(0);
}
private static void swap(List<Node> list,int x,int y){
Node tem = list.get(x);
list.set(x,list.get(y));
list.set(y,tem);
}
2)分成小,中, 大 三大部分再分别串起来
public static Node neth(Node head,int num){
if(head==null || head.next==null){
return head;
}
Node smallHead = null;
Node smallTail = null;
Node middleHead = null;
Node middleTail = null;
Node bigHead = null;
Node bigTail = null;
Node cur = head;
while(cur!=null){
if(cur.val<num){
if(smallHead==null){
smallHead = cur;
smallTail = cur;
}else{
smallTail.next = cur;
smallTail = cur;
}
}else if(cur.val>num){
if(bigHead==null){
bigHead = cur;
bigTail = cur;
}else{
bigTail.next = cur;
bigTail = cur;
}
}else{
if(middleHead==null){
middleHead = cur;
middleTail = cur;
}else{
middleTail.next = cur;
middleTail = cur;
}
}
cur = cur.next;
}
if(smallHead!=null){
smallTail.next = middleHead==null ? bigHead : middleHead;
}
if(middleHead!=null){
middleTail.next = bigHead;
}
return smallHead!=null ? smallHead : (middleHead==null ? bigHead : middleHead);
}
使用容器的策略就是快排的形式
不使用容器的策略就是分为将三个区域分开.