フォーチュンはランダム3_13深いコピーポインタとリストクラスベースの方法を残しました

 

問題:
  コピーノードを含むポインタランダムリスト
  タイトル次のように特殊なクラスリストノードが記載されている:
  パブリッククラスノード{
  公共の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で再現

おすすめ

転載: blog.csdn.net/weixin_33712881/article/details/93252273