シリーズ19は、プランを勝ち:リストの複雑なコピーを

この質問は、分割統治の典型である、それは解決するためにいくつかの小さなステップに大きな問題を分解します。私たちは、空のとき、質問へのポインタのポインタを使用するかどうかに注意を払う必要があります。(ポイントブランクは動作しません)ポインタを書き込むための割り当てを指す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 }

別のブログでこれを書き込む前に、今それを構成しています。

おすすめ

転載: www.cnblogs.com/neverland0718/p/11320088.html