- 問題描述
將單向鏈表按某值劃分成左邊小,中間相等、右邊大的形式。
- 解決方案1
將單鏈錶轉換成數組,然後按照數組的方式進行partion分組,小的在頭,大的在尾。注意這種方法會改變原來鏈表中數據的相對順序。
/**
* 將單鏈錶轉換成數組,然後進行partion分組,小的在頭,大的在尾
* @param head
* @param standard
*/
public static Node partionLinkedList1(Node head,Node standard){
if(head == null)
return null;
Node cur = head;
int len = 0;
while(cur != null){
len ++;
cur = cur.next;
}
Node[] arr = new Node[len];
cur = head;
int index = 0;
while(cur != null){
arr[index] = cur;
cur = cur.next;
index ++;
}
//數組partion過程
int small = -1;
int big = len;
for(int i = 0;i < big;i ++){
if(arr[i].value < standard.value){
small ++;
Node temp = arr[i];
arr[i] = arr[small];
arr[small] = temp;
}
else if(arr[i].value > standard.value){
big --;
Node temp = arr[i];
arr[i] = arr[big];
arr[big] = temp;
i --;
}
}
Node res = arr[0];
for(int i = 0;i < len - 1;i ++){
arr[i].next = arr[i + 1];
}
arr[len - 1].next = null;
return res;
}
- 解決方案2
將將單鏈表拆成比比較值小的small鏈表,相等的equal鏈表和大的big鏈表,然後將三個鏈表進行合併,注意邊界條件,鏈表是否爲空。這種方法不會改變原來鏈表中數據的相對順序。
/**
* 將單鏈表拆成small,equal,big三個鏈表,然後將三個鏈表進行合併
* @param head
* @param standard
*/
public static Node partionLinkedList2(Node head,Node standard){
if(head == null)
return null;
Node small = new Node();
Node smallTail = small;
Node equal = new Node();
Node equalTail = equal;
Node big = new Node();
Node bigTail = big;
Node cur = head;
while(cur != null){
if(cur.value < standard.value){
smallTail.next = cur;
smallTail = smallTail.next;
}
else if(cur.value > standard.value){
bigTail.next = cur;
bigTail = bigTail.next;
}
else{
equalTail.next = cur;
equalTail = equalTail.next;
}
cur = cur.next;
}
smallTail.next = equal;
equalTail.next = big;
cur = small;
//刪去equal和big節點
while(cur != null){
if(cur.next == big || cur.next == equal){
cur.next = cur.next.next;//刪去哨兵節點
}
else
cur = cur.next;
}
//返回small.next,跳過small節點
return small.next;
}