二つのアイデア:
1.リンクされたリストの逆接合来る、それは、接合点の前に、それぞれのノードの後に現在のノードを3つのポインタを必要とします。
2.各ノードは、新しいリストの最初のノードにノードを横断する、ヘッダを横切ります。
私が最初にお話しましょう、私は真剣に、ポインタの画像がアイデアをまっすぐノード、ビットの周りにこの時間をしました。アイデアは非常に明確に次のコードを説明注:
1つの#include <iostreamの> 2 使用して 名前空間STD; 3 構造体ListNode { 4。 INT ヴァル; 5 構造体 ListNode * 次に、 図6 ListNode(){} // 書き込みがデフォルトコンストラクタ、無パラメータを追加することである 。7 // ヴァル(X)、次に(NULL) 8。 9。 }; 10 クラスソリューション{ 11。 公共: 12である ListNode ReverseList *(* ListNode PHEAD){ 13は IF(PHEAD == NULL) 14 リターンNULL。 15 IF(pHead->次に== NULL) 16 リターンPHEAD; 17 ListNode * P1 = PHEAD; 18である ListNode * P2 = PHEAD; 19 ListNode * P3 = PHEAD; 20 P1 = pHead-> 次に、 21である P2->次に= NULL; 22は 、一方(!P1 = NULL) 23である { 24 ; P2 = P1->次// 次のノードの一時的なポインタを指すように 25 P1->次= P3; 26である // P3 = P2->次; 27 P1 = P3; // 常にせP3行う接合前に 28 P1 = P2; // P1は、現在のノード行う常にせて 29 } 30 リターン P3; // 行われたP1現在のノードが、後点P3とP1と、それP3返す必要が 31である 32 } ている33 }; 34は 、INT (メイン) 35 { 36 ソリューションSO; 37 構造体 ListNodeリスト[ 4 ]; // 突然実現、リスト本明細書で定義されるようには、引数ではない、パラメータがない存在しなければなりませんコンストラクタが、私は、パラメータのコンストラクタを定義するので、システムはデフォルトの引数なしのコンストラクタを定義することではありません前に 38 // パラメータなしで構造体変数を定義するために、引数なしのコンストラクタを追加する必要があります 39 リスト[ 0 ] .val =1 ; 40 リスト[ 0 ] .next =&リスト[ 1 ]。 41 リスト[ 1 ] .val = 2 。 42 リスト[ 1 ] .next =&リスト[ 2 ]。 43 リスト[ 2 ] .val = 3 。 44 リスト[ 2 ] .next =&リスト[ 3 ]。 45 リスト[ 3 ] .val = 4 。 46 リスト[ 3 ] .next = NULL; 47 ListNode *再= so.ReverseList(リスト)。 48 一方、(!再= NULL) 49 { 50 COUT <<再>ヴァル<< ENDL。 51 =再>再次。 52 } 53 リターン 0 。 54 }
私は学部のC ++クラスを覚えて、先生は強調し、新しいと同時に使用する必要があります削除します。私は後でポインタを削除するときにも常に削除する定義ポインタ変数を含む、と思います。これは、新しいスペースを開放しているので、削除し、この領域の使用を解除する必要があります。しかし、あなたはポインタ変数を定義する場合、それだけで一つの変数である、すべての変数は、メモリ空間のリリースをリリースする必要はありません。
第二の方法は、リストを再確立するには:
1 クラスソリューション{ 2 公共: 3 ListNode * ReverseList(ListNode * PHEAD){ 4 もし(PHEAD == NULL) 5 リターンNULL。 6 ListNode * P1 = NULL; 7 ListNode * P2 = NULL; 8 ListNode * P3 = NULL; 9 ながら(!PHEAD = NULL)// 头插法插入 10 { 11 P2 = P1。 12の P1 = PHEAD。 13 P3 = pHead->次; 14 P1->次= P2。 15 PHEAD = P3。 16 } 17 リターンP1。 18 19 } 20 }。
これは私が答えは、実際には、ほとんど私の考えで、私の考えは、ノードの最初の出発地点を取り出し、その後、新しいリスト私の頭の中に挿入されていることだと思いバージョンです。アイデアは、あなたが1つの以下の変数を構築することができますので、新しく作成されたリストに、元のリストのポイントの最初のノードに直接答えることです。
コードは以下の通りであります:
1 クラスソリューション{ 2 公共: 3 ListNode ReverseList *(* ListNode PHEAD)は{ 4 IF(PHEAD == NULL) 。5 リターンNULL; 6 ListNode * P = PHEAD; 7 ListNode PNODE * = NULL; // 新しいリスト接合を作成点 8。 ListNode pNext * = NULL; // 損失から次元ノードリストを保持する 9。 PNODE = P; // 最初に確立するための最初のノード 10 pNext = P-> 次を、 11 Pnode- >次に= NULL; 12であります P = Pnext。 13 ながら(!p = NULL) 14 { 15 Pnext = P-> 次。 16 P->次= PNODE。 17 PNODE = P。 18 、P = Pnext。 19 } 20 リターンPNODE。 21 22 } 23 }。
実際には、最初のノードへのニーズも直接にそこに配置することができながら、析出していないので、ほとんどの合理化バージョンを取得します:
1 クラスソリューション{ 2 公共: 3 ListNode ReverseList *(* ListNode PHEAD)は{ 4 IF(PHEAD == NULL) 。5 リターンNULL; 6 ListNode * P = PHEAD; 7 ListNode PNODE * = NULL; // 新しいリスト接合を作成点 8。 ListNode pNext * = NULL; // 損失から次元ノードリストを保持する 9。 しばらく(P = NULL!)// 第1の補間インサート 10 { 11。 pNext = P-> 次、 12は P - >次=PNODE; 13 PNODE = P。 14 、P = Pnext。 15 } 16 リターンPNODE。 17 18 } 19 }。
この問題は、単純で、第二、および明確な思考を使用することが推奨され、重要な代表者です。あなただけがリスト内の次のノードとオリジナルの新しいリストへの2つのポインタポイントを作成する必要があります。