この質問は、分割統治の典型である、それは解決するためにいくつかの小さなステップに大きな問題を分解します。私たちは、空のとき、質問へのポインタのポインタを使用するかどうかに注意を払う必要があります。(ポイントブランクは動作しません)ポインタを書き込むための割り当てを指すNULLポインタであることを、しかし、NULLポインタを任意の場所を指し示すことができないときは、この点を忘れてはなりません。
1の#include <iostreamの> 2の#include <ベクトル> 3 使用して 名前空間STDを、 4 構造体RandomListNode { 5 int型のラベル。 6 構造体の横RandomListNode *、* ランダム。 7 / * 8 RandomListNode(int型X): 9 ラベル(x)は、次の(NULL)、ランダム(NULL){ 10 } 11 * / 12 }。 13 14 クラスソリューション{ 15 公共: 16 RandomListNode *クローン(RandomListNode * PHEAD) 17 { 18は IF(PHEADは== NULL) 19。 リターンNULL; 20である // 3は、ステップ 21 // 最初のステップは、鎖として複製複合体ダブル 22は nodeclone(PHEAD) 23は 接続(PHEAD); 24 リターン再接続(PHEAD)。 25 } 26は、 空隙 nodeclone(RandomListNode * ヘッド) 27 { 28 RandomListNode * P = ヘッドと、 29 ながら(!P = NULL) 30 { 31は、 // 挿入ノード 32 // CUR = P->次に、 33である RandomListNode * = CURNODE 新しい新しいRandomListNode(); 34である curnode-> Pラベル=> ラベル; 35 curnode-は> = P-次> 次に、 36 curnode->ランダム= NULL; / / この文は書く必要がありますか? 37 P->次に= CURNODE; 38である P = curnode->次に、// サスペンションポインタ? 39 } 40 } 41は、 空隙接続(RandomListNode * ヘッド) 42である { 43は // ステップ:任意の位置にノードを指すランダム重複ポインタ 44はある RandomListNode * P = ;ヘッド 45 間(P = NULL!)// ポインタがアクセスしたときに、常に空気かどうかに注意を払う 46がある { 47 RandomListNodeは* = P-CURNODE> 次; 48 49 IF(P->ランダム=!NULL) 50 { 51は curnode-> = P-ランダム>ランダム> 次に、 ある52 } 53は、 54である P = curnode-> 次に、 55 56である } 57である } 58 RandomListNode再接続*(* RandomListNode ヘッド) 59 { 60 // :第3のステップは、2つの部分に分割リスト 61は RandomListNode * P = ;ヘッド 62は RandomListNodeは= Pコピー> * ;次に 63は 、一方(!P = NULL) 64 { 65 RandomListNode * = P-CURNODE> 次に、 66 IF(CURNODE!= NULL) 67 { 68 P->次に= curnode-> 次に; 69 } 70 71であり、 P = CURNODE; 72 } 73は、 リターンコピー; 74 } 75 }。 76 のint main()の 77 { 78 RandomListNodeリスト[ 5 ]。 79 リスト[ 0 ] .LABEL = 1 。 80 リスト[ 0 ] .next =&リスト[ 1 ]。 81 リスト[ 0 ] .random =&リスト[ 2 ]。 82 83 リスト[ 1 ] .LABEL = 2 。 84 リスト[ 1 ] .next =&リスト[ 2 ]。 85 リスト[1 ] .random =&リスト[ 4 ]。 86 87 リスト[ 2 ] .LABEL = 3 。 88 リスト[ 2 ] .next =&リスト[ 3 ]。 89 リスト[ 2 ] .random = NULL; 90 91 リスト[ 3 ] .LABEL = 4 。 92 リスト[ 3 ] .next =&リスト[ 4 ]。 93 リスト[ 3 ] .random =&リスト[ 1 ]。 94 95 リスト[ 4 ] .LABEL = 5; 96 リスト[ 4 ] .next = NULL; 97 リスト[ 4 ] .random = NULL; 98の 99 ソリューションソリュー。 100 RandomListNode *再= solu.Clone(リスト)。 101 int型のカウント= 0 ; 102 一方(再!= NULL) 103 { 104 // COUT <<再>ラベル<< " "<<再>ランダム>ラベル<<"、"。 105 coutの<<再>ラベル<< " " ; 106 の場合(再>ランダム! coutの<<再>ランダム> ラベル; 108 COUT << ENDL。 109 のカウント++ ; 110 再=再> 次。 111 } 112 // COUT << ENDL。 113 裁判所未満<< " 配列の数:" << <<数えてendl; 114 戻り 0 ; 115 }
別のブログでこれを書き込む前に、今それを構成しています。