リンクします。https://leetcode-cn.com/problems/rotate-list
kは非負であることを特徴とする請求リスト、回転のリスト、k個の位置だけ右にノードリストのそれぞれを、所与。
例1:
入力:1-> 2-> 3-> 4- > 5-> NULL、K = 2
出力:4-> 5-> 1-> 2- > 3-> NULLは
説明:
回転を右ステップ1:5- > 1-> 2-> 3-> 4- > NULL
時計回り2つのステップ回転:4-> 5-> 1-> 2- > 3-> NULL
例2:
入力:0-> 1-> 2-> NULL 、K = 4
出力:2-> 0-> 1-> NULLを
説明:
回転を右ステップ1:2-> 0-> 1-> NULLは
時計回りに回転2ステップ:1-> 2-> 0-> NULLが
時計回りに回転ステップ3:0-> 1-> 2-> NULLの
回転ステップ4右:2-> 0-> 1-> NULL
実際には、この質問は、k個のノードに前方に後方であるが、鎖長がそうモジュロkがn未満でなければならない保証するために、kの値nよりも大きいことが可能です。最初、順方向ポインタKステップを失望させ、同時に第一のポインタと第2のポインタが最初にまで行きましょう、第1のノードと最後から二番目のノードK + 1の逆数、及び前のように方法には2つのポインタのポイントを必要とします最後から二番目のノードへのポインタ、ときに、第2のポインタは最後から二番目のノード+ 1 kに。
これらのk個のノードの移動を開始、これらのk個のノードは、全体として最初のノードへの最初の元のヘッドポインタを移動させるようにし、次のノード第2のポインタをヘッドノードを作成し、及びに第2のポインタを聞かせ空。順序は、それ以外の場合はエラーになり、右でなければなりません。
この質問のヘッドノードが変更されましたが、ファイルは削除されませんので、仮想ノードを設定しませんが。
次のようにC ++のコードは次のとおりです。
1 クラスソリューション{ 2 公共: 3 ListNode * rotateRight(ListNode *ヘッド、int型K){ 4 もし(!ヘッド)戻りNULL。 5 INT N = 0 。 6 用(; P P = P->オートP =ヘッド{次) 7 N ++ 。 8 } 9 K%= N。 10 自動最初=ヘッド、第二= ヘッド。 11 一方(k-- ){ 12 第=最初- > 次。 13 } 14 ながら(初段> 次){ 15 第=初段> 次。 16 = 2次>第二次。 17 } 18 初段>次= ヘッド。 19 ヘッド= 2次> 次。 20 2次>次= NULL; 21 リターンヘッド; 22 } 23 }。