package com.interview.algorithms.list;
import com.interview.basics.model.collection.list.LinkedList;
import com.interview.basics.model.collection.list.Node;
/**
* Created_By: stefanie
* Date: 14-7-10
* Time: 下午9:30
*/
public class C3_10_ListPartition {
public static void partition(LinkedList<Integer> list, int K){
list.setHead(partition(list.getHead(), K));
}
public static Node<Integer> partition(Node<Integer> head, int K){
Node<Integer> newHead = new Node<>(0);
newHead.next = head;
Node<Integer> p = newHead;
Node<Integer> q = newHead;
while(q.next != null){
if(q.next.item.compareTo(K) >= 0) q = q.next; //larger or equals, move q
else {
if(p == q) q = q.next; //equals, not need to change, both move to next
else { //insert q.next after p, p move to next
Node<Integer> temp = q.next;
q.next = temp.next;
temp.next = p.next;
p.next = temp;
}
p = p.next;
}
}
return newHead.next;
}
private static void swap(Node<Integer> n1, Node<Integer> n2){
int temp = n1.item;
n1.item = n2.item;
n2.item = temp;
}
public static void partitionTwoLink(LinkedList<Integer> list, int key){
Node<Integer> p = list.getHead();
Node<Integer> small = null;
Node<Integer> large = null;
Node<Integer> largeHead = null;
while(p != null){
if(p.item < key) {
if(small == null) small = p;
else {
small.next = p;
small = p;
}
} else {
if(large == null) largeHead = large = p;
else {
large.next = p;
large = p;
}
}
p = p.next;
}
small.next = largeHead;
}
public static void partitionRecursive(LinkedList<Integer> list, int key){
Node<Integer> node = list.getHead();
Node<Integer> small = null;
Node<Integer> large = null;
while(node != null){
Node<Integer> next = node.next;
if(node.item < key){
node.next = small;
small = node;
} else {
node.next = large;
large = node;
}
node = next;
}
if(small == null) {
list.setHead(large);
return;
} else {
list.setHead(small);
while(small.next != null) small = small.next;
small.next = large;
}
}
}