トピック:
単独リンクリストを逆にします。
例:
入力:1-> 2-> 3-> 4- > 5-> NULLの 出力:5-> 4-> 3-> 2- > 1-> NULL
高度:
あなたは、反復逆転または再帰的に一覧表示することができます。次の2つの方法でこの問題を解決することはできますか?
ソリューション:
コードの最初に:
/ ** 。片方向リンクについて*定義リスト {*パブリッククラスListNode ; * int型ヴァル * ListNode次; * ListNode(int型X){X =ヴァル;} *} * / クラスのソリューション { 公共ListNode reverseList(ListNodeヘッド) { IF(ヘッド== NULL || head.next == NULL)// リストが空または唯一の要素である { 戻りヘッド; } 他 { ListNode newHead ; = reverseList(head.next)// ステートメントによって、再帰その後、ノードの後にヘッドノードは、すべてのフリップを完了した、この時間は、ちょうど新しいリスト上のノードを頭に必要なのは最後のようなものです =ヘッドhead.next.next; // ヘッドノードがhead.next.next置かれるべき head.next = NULL ; // ヘッドが最後のノードであり、ヌル= head.next 戻り newHeadを; //は、新しいヘッドを返します出発点としてノード、再帰 } } }
反転コード上記の再帰的なリスト
再帰終了条件: 1、頭は空です。2、head.nextは空です
再帰プロセス:我々は新しいヘッドノードnewHead、head.nextはヘッドフリップの後に終了する必要がありますnewHead新しいヘッドノードを作ります。同時にヘッドでhead.nextの後ろに置かれ、head.next =ヌルを作るべきです。だから我々は、リストの最後の頭の上に新しい顔を置く(このステップを達成するために再帰的に最後の飛行機まで、のは、どのようなこの再帰的プロセスを示す図を描いてみましょう)。
アルゴリズム分析:
空間的複雑さ、分析時間の複雑さ:全体の時間複雑度は、再帰O(N)であり、nは鎖長であるので、時間計算量は、O(1)であり、再帰再帰毎回を含みます。宇宙の複雑さのために、再帰的なアルゴリズムが開く新しいスペースを必要としないので、空間計算量はO(n)は、(空間的な複雑さの分析は、問題を抱えているようだ......)であります
これは非再帰的なアルゴリズムはありますか?いくつか!実際には、非再帰再帰的なアルゴリズムのほとんどは達成することが可能ですが、少し複雑。
そして、最初の非再帰的なアルゴリズムのコードは、その後、アルゴリズムにそれを分析します!
/ ** *単一リンクリストのための定義。 *パブリッククラスListNode { * int型のval; * ListNode次。 * ListNode(INT X){ヴァル= X。} *} * / クラスソリューション { 公共ListNode reverseList(ListNodeヘッド) { ListNode newNode = 新しい ListNode(-1 )。 ListNodeノード1、ノード2、ノード3。 newNode.next = ヘッド。 ノード1 = newNode; もし(node1.next == nullの || node1.next.next == nullの)// 和上面一样的原因 { 戻りヘッド; } 他 { NODE2 = node1.next; ノード3 = node2.next; ながら(!ノード3 = NULL)// 次のコードは、達成するための鍵であり、各ノードはヘッドノードの位置に転送され、その後、ノード2、ノード3ポインタが移動した後。 { Node2.next = node3.next; ListNodeのTEMP = node1.next; node1.next = ノード3; node3.next = TEMP; ノード3 = node2.next; } } 戻りnewNode.nextと、 } }
アルゴリズム分析:
図1に示すように、仮想newNodeヘッドノードの集合、及び3つのポインタ、ノード1、ノード2、ノード3。
2、そうnewNode.nextポイントヘッド。
3、newNode.next.nextまたはnewNode.next == nullは元のリストに直接返送された場合
4.それ以外の場合は、ノード2ポイントnode1.next、ノード3ポイントnode2.nextてみましょう
5、ノード3が空でない場合は、次のセクションを実行します。
ノード3ノード点は、ノードにNODE2ポイントは、ノードの前に処理される、処理されます。
だから、node2.nextポイントnode3.next
一時的なノードの一時を設定し、ストレージnode1.next
ノード3ので、ノードはヘッドノードの位置に処理されるとnode3.next TEMPを作るために約node1.next点であります
ノード3値を更新しnode2.next
結果は、フリップ後に返すnewNode.next
ここでは手描きのプロセスを実行するためのコードは次のとおりです。ABC CBAにフリップ
分析アルゴリズム:Oの時間複雑度(n)は、nは、1周期に1回、スペースを開放するための一時的なノード鎖長及びスペースの複雑で、予約だけ最後ので、空間複雑性O(1)。