入力されたリンクリスト、リンクリスト出力の逆数k番目のノード。
コアアイデア2つのポインタが、ポインタが最初のノード、第一の補正第1及び第2のポインタのポイントをできるようにした後、(K-1)ステップ手放す、k番目のノードに到達します。
最初のものは、エンド・ノード、位置は最後から二番目のノードkである第2のノードに到達したときに、2つのポインタは、同時に後退します
O(N)の時間計算量、トラバースことができ
1 / * 2つの パブリッククラスListNode { 3 int型のval; 4 ListNode次= NULL; 5 6 ListNode(int型のval){ 7 this.val =ヴァル。 8 } 9 } * / 10 インポート java.utilの*。; 11 パブリック クラスソリューション{ 12 パブリック 静的 ListNode FindKthToTail(ListNodeヘッド、int型K){ 13 // 特殊情况判定 14 であれば(ヘッド== NULL) 戻り ヌル。 15 IF(K <= 0) 戻り NULL ; 16 // 二つのポインタを作成する 17。 ListNodeのfastptr = ヘッド、 18は ListNode slowptr = ヘッド; 19 // 高速ポインタがノードにK-1を実行した(最初のデフォルトノード1はありません0) 20である ため(INT I = 1; Iは、Kを<; I ++は){ 21は、 IF(fastptr.next!= NULL ){ 22は fastptr = fastptr.next; 23である } 24 他の 戻り NULL ; // へ考慮して鎖長がK未満である 25 } 26は 、一方(!fastptr.next = ヌル){ 27 fastptr = fastptr.next; 28 slowptr = slowptr.next; 29 } 30 リターンslowptr; 31である } 32 公共 静的 ボイドメイン(文字列[]引数){ 33である スキャナSC = 新しい新スキャナ(System.in); 34で のSystem.out.println( "最後から二番目のノードの番号を入力してください" ); 35 INT K = sc.nextInt(); 36 のSystem.out.println( "順次リンクされたリストを入力してください" )。 37 ヘッド= ListNode NULL ; 38である IF(sc.hasNext())=ヘッド新しい新しいListNode(sc.nextIntを()); 39 ListNodeのTEMP = ヘッド; 40 ながら(sc.hasNext()){ 41は = TEMP 新しい新しいListNode(SC。 nextInt()); 42である TEMP = temp.next; 43である } 44れる temp.next = NULL ; 45 ListNode結果= FindKthToTail(頭部、k)は、 46である のSystem.out.println( "リンクされたリストのK最後から二番目のノードです" + 結果); 47 } 48 }
バグの試運転
bug1:Kが負と見なされていないか、Kは何ら考慮ヘッドが空でない、0であり、添加ライン13及び14
bug2:Kは、リストの長さよりはるかに大きい場合に考慮していない、リストを選択することができ、長さKの比較関数を記述するために必要なこの時間の長さ、より激しいです
それともこの状況を解決するために使用され、fastptr.next fastptrあり、ここに注意を払っていないことができます
17は(INT i = 1; iはK <; iは++){
18 IF(fastptr.next!= NULL){
19 fastptr = fastptr.next。
20}
21そうでない場合はnull;
bug3:牛は最終顧客のネットワークの状態を入力しませんが、入力リストを終了するかを決定でIDEAは、問題となっています
参照ピクチャから:https://yinziang.github.io/yinziang/2018/03/05/Algo-OJ-Others-3/
主な機能は、IDEAに変更する必要があります。