問題:
コピーノードを含むポインタランダムリスト
タイトル次のように特殊なクラスリストノードが記載されている:
パブリッククラスノード{
公共のint値、公共次にノードとパブリック
ノードRAND、
パブリック・ノード(INTデータ)=データ{this.value ;}
}
ノードクラスの値は、ノード値、次ポインタと通常のシングルリンクリストの次の意味ポインタである
一つのサンプル、次のノードへのすべてのポイント、RANDポインタノードクラス新しいポインタを、これは意味
針がリンクされたリストを指すこと任意のノードは、それがnullに指し示すことができます。与えられた
一本鎖非環式ヘッドノードNode型のヘッドノードを完全に達成するための機能で構成
されたリンクリスト構造のすべてのコピーを、ヘッドノードは、複製の新しいリストを返します。高度:
追加データ構造、変数のみの限られた数、及び時間複雑さ(N)Oの
元の問題の中に実装される補完機能。
溶液 :
:
元のリストのhash_mapを格納するために使用される
キー=元のリスト、値=新しいリンクされたリストのノード
との新たな構造的構成の元のリストの構造リスト
の2つの
元のリストアレイ場所2つのコピーを:
ヘッド2. 3. 1 4 5 6 NULLの
コピーに:ヘッドヘッド'1' 2 2 3 '3' 4 4 '5' 6 '6' NULL
ノードは、行上のバンドのコピー」を取り
1 の#pragma回 2の#include <iostreamの> 3の#include <hash_map> 4 5 使用 名前空間STDを、 6 7 構造体ノード 8 { 9 int型のval; 10 ノード* ランド。 11 ノード* 次の; 12 (ノードINT = - 1 ):valを(a)に示すように、ランド(NULL)、次の(NULL){} 13 }。 14 15 16ノード* CopeListDeep(ノード* ヘッド) 17 { 18 hash_map <*ノード、ノード*> マップ; 19。 ノード* P = ヘッド、 20は 、一方(P)// 新しいリンクされたリストの構造 21は 、{ 22は マップ[P] = 新しい新しいノード( - 1。 )、 23は P = P-> 次に; 24 } 25 26であり、 P = ヘッド; 27 ながら(P)// 新しいリスト構造を再構築 28 { 29 マップ[P] - > = P-ヴァル> ヴァル; 30 マップ[P] - >次に地図= [P - > 次に]; 31であります 地図[P] - >ランド=マップ[P-> ランド]。 32 P = P-> 次。 33 } 34 リターンマップ[ヘッド]。 35 } 36 37ノード* CopeListDeep2(ノード* ヘッド) 38 { 39 ノード* CUR = ヘッド。 40 ノード*次回= NULL; 41 一方(CUR)// 将原链表复制两份 42 { 43 次= cur-> 次。 44 cur->次= 新しいノード(cur-> ヴァル) 45 CUR>ネクスト>次に=次に; // ここでは、2つの重複コード 46は、 CUR = 次に; 47 } 48 49 CUR = ヘッド; 50 ノードcopyHead * = NULL; //は、元の鎖を区別するために 51 // 最初コピーランド・ノード 52は 、一方(CUR)// 新しいノードの構造を再構成する 53である { 54である >次に次にCUR =>ネクスト; // 元のトラバースリスト 55 copyHead = CUR> 次に、 56であります copyHead-> = RAND(?(CUR> RAND)== NULLのNULL:(CUR> RAND) - > 次へ) 57 CUR = 次回。 58 } 59 // copyHead已经是链表的末尾NULL 60 = CUR ヘッド。 61 ノード* RES =頭部> 次。 62 一方(CUR) 63 { 64 次= cur->ネクスト> 次。 65 copyHead = cur-> 次。 66 cur->次= 次回。 67 copyHead->次=(次== NULL)?NULL:ネクスト> 次; 68 CUR = 次回。 69 } 70 71 //なぜ、ワンタイム短縮と、コピー元のリストのリストを再構築しませんか? 72 // フロントため、還元、後半の元のリストの半分一度ランド点の前半一旦、元のリストは、ポイントを見つけることである 73 // ないノードが、元のリストの前半は、復元されたので、そうリストランドをコピー指摘の元のリストの位置に応じて、独自のノードランドを見つける 74 // それは最初のランドがそれをコピーしました。 75の リターンRES; 76 77 } 78 79 80 ボイド試験() 81 { 82 ノードヘッド* = 新しい新しいノード( - 1 ); 83 頭部>次に= 新しい新しいノード(1 ); 84 頭部>ネクスト>次に= 新しい新ノード(2 )。 85 頭部>ネクスト>ネクスト>次= 新しいノード(3 )。 86 頭部>ネクスト>ネクスト>ネクスト>次= 新しいノード(4 )。 87 頭部>ネクスト>ネクスト>ネクスト>ネクスト>次= 新しいノード(5 )。 88 頭部>ネクスト>ネクスト>ネクスト>ネクスト>ネクスト>次= 新しいノード(6 )。 89 頭部>ネクスト>ネクスト>ネクスト>ネクスト>ネクスト>ネクスト>次= NULL; 90 91 92 頭部>ランド= NULL; 93 頭部>ネクスト>ランド=頭部>ネクスト>ネクスト>ネクスト> ネクスト>ネクスト> 次; 94 頭部>ネクスト>ネクスト>ランド=頭部>ネクスト>ネクスト>ネクスト>ネクスト>ネクスト> 次。 95 頭部>ネクスト>ネクスト>ネクスト>ランド=頭部>ネクスト>ネクスト>ネクスト>ネクスト> 次。 96 頭部>ネクスト>ネクスト>ネクスト>ネクスト>ランド=頭部>ネクスト>ネクスト> 次。 97 頭部>ネクスト>ネクスト>ネクスト>ネクスト>ネクスト>ランド= NULL; 98 頭部>ネクスト>ネクスト>ネクスト>ネクスト>ネクスト>ネクスト>ランド=頭部>ネクスト>ネクスト>ネクスト> 次。 99 100 101 COUT << " 打印原链表:" << ENDL。 102 ノード* p =頭部> 次。 103 一方、(P) 104 { 105 COUT << " 次:" << P->ヴァル<< " ランド:" <<((P->ランド)P-> rand->ヴァル: - ?1)<< ENDL。 106 P = P-> 次。 107 } 108 109 COUT << ENDL << " 打印新链表:" << ENDL。 110 P = CopeListDeep2(ヘッド) - > 次。 111 一方、(P) 112 { 113 COUT << " 次:" << P-><<((P->ランド)P-> rand->ヴァル: - ?1)<< ENDL。 114 P = P-> 次。 115 } 116 117 118 }
ます。https://www.cnblogs.com/zzw1024/p/10993026.htmlで再現