/ * タイトル: 機能を実装して、リストの複製コンプレックス、ヘッドノードは、コピーリストを返します。 * / / * アイデア: 最初のステップ、コピーリストS」、Sは元のリストに挿入されています。 第二のステップ、ランダムポインタリストのチェーンS「Sの複製。 第三ステップ:Sリストの分割およびS」。 * / の#include <iostreamの> する#include <string.hの> する#include <アルゴリズム> の#include <cmath> する#include <stdio.hに> する#include <ベクトル> の#include <スタック> の#include <キュー> 名前空間STDを使用して、 RandomListNode {構造体 INTラベル、 構造体次にRandomListNode *、*ランダム; RandomListNode(INT X): ラベル(X)、次に(NULL)、ランダム(NULL){ } }; RandomListNodeクローン*(* RandomListNode PHEAD) { IF(PHEAD == nullptr A)PHEADリターン; //最初のステップ、コピーリストS」、Sは、元のリストに挿入されます。 = *•PNODE PHEAD RandomListNode、 一方(•PNODE){ RandomListNode * = newNode新しい新しいRandomListNode(pNode->ラベル); newnode->次に= pNode->次に、 pNode->次にnewNode =; •PNODE = pNode->ネクスト>次に; } //第二工程、ランダムポインタリストのチェーンS「Sレプリケーション。 = PHEAD•PNODE; RandomListNode qNode * = pHead->次に、 しばらく(qNode->次に&& qNode->ネクスト>次){ IF(!pNode->ランダム= nullptr A){ qNode->ランダム= pNode->ランダム>次に; } •PNODE = qNode->次に、 qNode = pNode->次に、 もし(pNode->ランダム= nullptr!) qNode->ランダム= pNode->ランダム>次。 //第三步:。拆分链表S和S ' PNODE = PHEAD。 qNode = pHead->次。 RandomListNode * qHead = pHead->次。 一方、(PNODE){ pNode->次= qNode->次。 IF(qNode->次= nullptr!){ qNode->次= qNode->ネクスト>次。 } PNODE = pNode->次。 qNode = qNode->次。 } qHeadを返します。 } int型のmain(){ RandomListNode *ノード1 =新しいRandomListNode(1)。 RandomListNode *ノード2 =新しいRandomListNode(2); RandomListNode *ノード3 =新しいRandomListNode(3); node1->次=ノード2。 node2->次=ノード3。 node2->ランダム=ノード1。 RandomListNode * RES =クローン(ノード1)。 (RES){一方 COUT << RES->ラベル<< ENDL。 RES = RES->次。 } }