リンクリストを考えると、すべての2つの隣接ノードを交換し、その頭を返します。
あなただけ自体を変更することができるノードは、リストのノードの値を変更することはできません。
例:
1 - > 2 - > 3 - > 4を考えると、あなたは、2-> 1 - > 4 - > 3リストを返す必要があります。
単独リンクリストを逆にします。
例:
入力:1-> 2-> 3-> 4-> 5-> NULLの
出力:5-> 4-> 3-> 2-> 1-> NULL
フォローアップ:
リンクリストは、いずれかの繰り返しや再帰的に反転させることができます。あなたは両方を実装してもらえますか?
ここでは、唯一の再帰的なアルゴリズムを検討し、24は、交換の内の2つのノード間で、最初からです。206はスタートからフィニッシュまで、逆の順序です。(のみスイッチングノードリストか交換が達成新しいノードの値を考慮して)
我々のコードに
24
1 クラスソリューション{ 2 公共: 3 ListNode * swapPairs(ListNode * ヘッド){ 4 であれば(ヘッド== NULL ||頭部>次== NULL) 5 リターンヘッド。 6 ListNode * T =頭部> 次。 7 頭部>次= swapPairs(T-> 次); 8 T->次= ヘッド。 9 リターントン。 10 } 11 }。
206
1 クラスソリューション{ 2 公共: 3 ListNode * reverseList(ListNode * ヘッド){ 4 であれば(ヘッド== NULL ||頭部>次== NULL){ 5 リターンヘッド。 6 } 7 ListNode * RET = reverseList(頭部> 次); 8 頭部>ネクスト>次= ヘッド。 9 頭部>次= NULL; 10 リターンRET; 11 } 12 }。
1-> 2-> 3-> 4鎖は、例えば、次のとおりです。
(第1のコードセグメントに対応するグリッド線数の数)
(* 3はノード3へのポインタの値を表します)
(ダブルプログラムのラインの流れを矢印します)
24可視3つのノードを考慮 - >現在のノードは、現在のノードの隣の点、次のノード現在のノード点の次のノード(再帰リターン)。
最初の2つのノードがこれら3つのノードを交換することができ、ノード再帰リターンは、調整ノードを有するとみなさ。(なお、コードセグメントの中央に再帰呼び出し、この手段中央ノードポインタフィールド変形こと)
そして戻って、現在のノードの次のノードへのポインタが実行され、リストに全体の交換であるとして、あなたがマクロの概念を持っている必要があり、その後、元のリストの究極のリターンはそう常にプッシュ、最後のノードのポインタである、206を考えますそれは、常に「オリジナルにリストの相対的な最後のノードへのポインタ」です。(すなわち、最後のノードに直接圧力を可能にする、ノードポインタフィールドの変更、前、プログラムが最初にスタック解除= * 4 <ヘッドから即ち、第1の時間、戻り値最後の再帰を返すように続け、コードセグメントの前に再帰呼び出しすることを注スタック解除>)同じポインタの末尾に返されます
ノードが前になる前に、それ自体へのノードを再帰的に最後の再帰A「ノードの次のノードを」返すので再帰的には、編集ポインタフィールド自体に、ノード自体にノードポイントの前と後にノードを発生していません現在のノードへのポインタフィールドポイントを変更します。再帰リターンノードポインタ(現在ヘッドノード)の終了後
ルック手順と書かれた手順を理解し、約書き込みできるようになり、今ポインタ他人の数と位置を一瞥、二つの異なるものです。しかし、完全に自分の書き込みがあまりにも困難でした。
1.返された何
2. DO
3.終了します
- > 4つの再帰呼び出し位置。
問題を検討するために、各個人のやり方、各オプションが異なる原因を有することができます。さまざまな問題の規模モデリングからは、各オプションが異なることを行うことがあり、道路の多くを持っているかもしれませんが、正しい道へのアクセスが制限され、本当に。