(各ノードは、ノードの値を有し、二つのポインタ、次のノード、他のノードへの特別なポインタを指し示すもの)、複合入力リストを[安全オファーを証明する]複合リスト複製の頭部後の値を返します。

トピック物語

複合入力リスト(各ノードは、ノードの値を有し、二つのポインタ、次のノードへの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;
    }
};
公開された57元の記事 ウォン称賛28 ビュー4119

おすすめ

転載: blog.csdn.net/weixin_41747893/article/details/104583346