A. 問題の説明
kは非負であることを特徴とする請求リスト、回転のリスト、k個の位置だけ右にノードリストのそれぞれを、所与。
例1:
入力:1-> 2-> 3-> 4-> 5-> NULL、K = 2
出力:4-> 5-> 1-> 2-> 3-> NULL
説明:
5-> 1-> 2-> 3-> 4-> NULL:右ステップ1を回転させます
4-> 5-> 1-> 2-> 3-> NULL:右のステップ2を回転させます
例2:
入力:0-> 1-> 2-> NULL、K = 4
出力:2-> 0-> 1 - > NULL
説明:
2 - > 0-> 1 - > NULL:右ステップ1を回転させます
右ステップ2回転:1-> 2-> 0-> NULL
0-> 1 - > 2 - > NULL:右ステップ3を回転させます
右ステップ4回転:2-> 0-> 1 - > NULL
II。問題解決のためのアイデア
ステップ1:単一リンクされたリストを見つけるために最後のサイクルは、最初のノードの次のノード、円形のリストを形成する。この時間を指します。
ステップ2:リストを取得するために長さの長さは、我々は、モバイルは、結び目の長さ=%ノードが権利を取得、最初のノードから後方鎖長-kの先頭を見つけるために、実際には、K-1サイクルであることを知ることができます。
ステップ3:循環リストと単一リンクされたリストに、この時間をヌル形成ノードを切断し、次のノードがヘッドノードです。
III。結果
実行時:1ミリ秒は、Javaの提出のすべてのユーザーの99.90パーセントを破りました。
メモリ消費量:35.8メガバイトには、Javaの提出のすべてのユーザーの82.91パーセントを破りました。
IV。Javaコード
クラスソリューション{ 公共 ListNode rotateRight(ListNodeヘッド、int型K){ 場合(ヘッド== NULL || K == 0 ) { 戻りヘッド。 } ListNode最初 = ヘッド。 ListNode第 = ヘッド。 一方、(真) { 場合(second.next == NULL ) { ブレーク。 } 第二 = second.next。 } int型の長さ= 0。 ListNode M= ヘッドと 一方、(!M = NULL ) { 長 ++ 。 M = m.next。 } second.next = 最初; 長さ =長さkの%の長さ。 以下のために(int型 i = 1; iは長さ<; iは++ ) { 最初 = first.next。 } 第 = 最初; 最初 = first.next。 second.next = nullを。 返す 最初; } }