解法一:利用一个数组存储node节点,快排思想进行swap操作
public Node listPartition(Node head,int pivot){
if (head==null) return null;
Node cur = head;
int i = 0;
//计算节点个数
while (cur!=null){
i ++;
cur = cur.next;
}
Node[] nodeArr = new Node[i];
cur = head;
for ( i = 0; i < nodeArr.length; i++) {
nodeArr[i] = cur;
cur = cur.next;
}
//进行调整
arrPartition(nodeArr,pivot);
for ( i = 1; i < nodeArr.length ; i++) {
nodeArr[i-1].next = nodeArr[i];
}
nodeArr[i-1].next = null;
return nodeArr[0];
}
private void arrPartition(Node[] nodeArr, int pivot) {
int i = -1,j = nodeArr.length,index = 0;
while (index!=j){
if (nodeArr[index].value<pivot){
swap(nodeArr,++i,index++);
}else if (nodeArr[index].value>pivot){
swap(nodeArr,--j,index);
}else index++;
}
}
public void swap(Node[] nodeArr,int a,int b){
Node temp = nodeArr[a];
nodeArr[a] = nodeArr[b];
nodeArr[b] = temp;
}
解法二:三部分设置变量保存头和尾来表示
public Node listPartition2(Node head,int pivot){
//小的头和尾
Node sH = null,sT = null;
//相等的的头和尾
Node eH = null,eT = null;
//大的头和尾
Node bH = null,bT = null;
Node next = null;
while (head.next!=null){
next = head.next;
head.next = null;
if (head.value<pivot){
if (sH==null){
sH = head;
sT = head;
}else {
sT.next = head;
sT = head;
}
}else if (head.value==pivot){
if (eH==null){
eH = head;
eT = head;
}else {
eT.next = head;
eT = head;
}
}else {
if (bH==null){
bH = head;
bT = head;
}else {
bT.next = head;
bT = head;
}
}
head = next;
}
//小的和相等的结合
if (sT!=null){
sT.next = eH;
//查看有无小的结尾
eT = eT!=null?eT:sT;
}
//所有的链接
//可能是eT,可能是sT
if (eT!=null){
eT.next = bH;
}
return sH!=null ?sH :eH!=null ?eH :bH;
}