トピック物語
複合入力リスト(各ノードは、ノードの値を有し、二つのポインタ、次のノードへの1つのポインティング、他のノードへの特別なポインタ)は、複雑なリストの複製の頭部後の値を返します。(出力結果は、パラメータノード参照を返さないことに注意、それ以外のプログラムは、直接、空の宣告質問に戻ります)
シンプルなアイデア
コード難しさは、分割時どのように分割する第三の工程のですか?
これは下記のリスト内の各ノードに1-挿入された第一のコピー
2-任意添加ランダムポインタ
A:例えば図元々任意の点A上のポインタとしては、C、我々はこのケースを実行するためA1 C1ポインタを解放する必要がある場合であります- >ネクスト> = A->ランダムランダム>次。等号の左側はランダムのA1はC1を指し、等号の右側を指します。
このリストに3分割のうち
、次に注意を払う必要があり、このサイクルの条件のように、その後、どのような彼らのテイクストロークを把握します。私は本当に渡したくありませんでした。
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
if(pHead==NULL)
return NULL;
RandomListNode* res=pHead;
//第一步:首先先在链表里面插入每个节点的复制
while(res){
RandomListNode* node=new RandomListNode(res->label);
node->next=res->next;
res->next=node;
res=node->next;
}
res=pHead;
RandomListNode* p;
//第二步:
while(res){
p=res->next;
if(res->random)
p->random=res->random->next;
res=p->next;
}
//第三步:对链表进行拆分
RandomListNode* head=pHead->next;
RandomListNode* temp;
res=pHead;
while(res->next){
temp=res->next;
res->next=res->next->next;
res=temp;
}
return head;
}
};