/ **
*タイトル:チェックリストの特定の値によっては、小さなに分割し、中間、大きな右フォームに等しい左
*
:*要件
次に、*ノードの所定のヘッドウェイリンクリストの最初のノードは、整数値タイプであります整数privot与えられます。実装
リンクされたリストを調整する*関数を、リンクされたリストは、左側部分に調整されているより少ないノードprivotの値より、中間部分が等しいprivotである
*ノードは、ノードprivotの右側部分よりも大きいです。この要件に加えて、調整ノードの順序のためのより多くの要件は存在しません。
*たとえば、次のリスト9-> 0-> 4-> 5-> 1、privot = 3。リスト1-> 0-> 4-> 9-> 5に調整することができる、それがあってもよい
* 0-> 1-> 9-> 5> 4。要するに、ノードの一部は小3の左千ある満たすために、中央部分がノード3に等しく、右の部分である
*ノードが3よりも大きくすることができます。内部ノードの順序の一部に必要とされません。
*
*分析:
*ソリューション時間複雑度はO(N)であり、追加の空間の複雑さはO(N)、リンクされたリスト内のすべてのノードが正面にある
アレイ*外し、その後均一な調整の位置を計測します。次のように具体的なプロセスである:
* 1再度リストの長さがNであると仮定すると、長さを得るためにリストを横断します
* 2は、その後、順次nodeArrrayにノードのリンクリストをトラバース、ノード長N型アレイnodeArrを生成します。
*以下、よりprivotの左側のノードで3 nodeArrayは、中央、右のより大きいを置くために等しいです。
*長いnodeArrayによってノードと、ステップ3、被験者の要件を満たすためnodeAn-ノード順序の調整後4
全体処理を終了する*再接続時間まで。
*
* @Author雪の瞳
*
* /
パブリッククラスノード{
公共のint値。
次のパブリック・ノード。
パブリック・ノード(intデータ){
this.valueデータを=。
}
}
{クラスListPartパブリック
プライベート・ノード現在; //現在のノード
のプライベートINT nodeLength = 0; //鎖長
プライベート・ノードnodeArray [] = NULL; // リストアレイ
プライベートINT iは= 0; //ループ変数
プライベートINTをcurrentValueは= 0。ノードの//現在値
公衆listPartノード(ノードヘッド、int型privot){
IF(ヘッド== NULL){
戻りヘッド;
}
//リストの長さの取得
、電流=ヘッド
ながら(!電流= NULL){
nodeLength ++と、
電流=電流.next;
}
//リスト配列の内容書き込み
; nodeArrayノード新しい新しい= [nodeLength】
電流=ヘッドと、
一方(I <nodeLength){
nodeArray [I] =現在;
I ++;
現在= current.next;
}
//排序
int型の小= -1;
int型の大= nodeArray.length。
int型のインデックス= 0;
一方、(インデックス=大きい!){
currentValueは= nodeArray [インデックス] .VALUE。
IF(currentValueは<privot){
swapElements(nodeArray、++小さなインデックス++)。
}そうであれば(currentValueは> privot){
swapElements(nodeArray、--big、インデックス)
}他{
インデックス++;
}
}
//重新连接链表
ため(I = 1; I = nodeLength;!私++){
nodeArray [I-1] .next = nodeArray [I]。
}
nodeArray [nodeLength-1] .next = NULL;
ヘッド= nodeArray [0]。
頭を返します。
}
//数值交换函数
公共ボイドswapElements(ノードnodeArray []、INT A、INT b)は{
ノードtranElements = NULL;
tranElements nodeArray = [B]。
nodeArray [B] = nodeArray [A]。
nodeArray [A] = tranElements。
}
}
import java.util.Random;
import java.util.Scanner;
public class TestListPart {
public static void main(String[] args) {
ListPart list = new ListPart();
TestListPart test = new TestListPart();
//获取初始信息
Random rand = new Random();
Scanner sc = new Scanner(System.in);
System.out.println("请输入链表长度");
int K = sc.nextInt();
System.out.println("请输入位置元素值");
int privot = sc.nextInt();
//随机生成链表
Node nodes[]=new Node[K];
for(int i=0;i<nodes.length;i++) {
nodes[i]=new Node(rand.nextInt(20)+1);
}
for(int i =0;i<nodes.length-1;i++) {
nodes[i].next=nodes[i+1];
}
Node head = nodes[0];
//test
test.showNode(head);
Node partNode = list.listPart(head, privot);
test.showNode(partNode);
}
public void showNode(Node head) {
System.out.println("链表内的元素如下所示...");
while(head != null) {
System.out.print(head.value+"\t");
head = head.next;
}
System.out.println();
}
}
* 运行结果