チェーンテーブルにランダムrandポインタを含むレプリケーション


#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
class Node {
public:
    Node* next;
    Node* rand;
    int value;
};

Node* copy_list_with_rand_ptr(Node* list) {
    if(list == NULL) {
        return NULL;
    }

    /*
     *  :http://hi.baidu.com/gkqofoydngbjqtq/item/6345d6104b7a8d06e65c36a3
     * 1、 next
     * 2、 rand rand-->next
     * 3、 , , 
     * */

    // 
    Node* p = list;
    while( p ) {
        // 
        Node* n = new Node();// 
        n->rand = p->rand;
        n->value = p->value;

        // 
        n->next = p->next;
        p->next = n;
        p = n->next;
    }


    // , rand 
    p = list;
    while( p ) {
        p = p->next;
        p->rand = p->rand->next;
        p = p->next;
    }

    // 
    p = list;
    Node* result = list->next;
    Node* t = result;
    while( p ) {
        p->next = t->next;
        p = p->next;
        if( p ) {
            t->next = p->next;
            t = t->next;
        } else {
            t->next = NULL;
        }
    }
    
    return result;
}

void print_list(Node* list) {
    printf("
"); if( list == NULL) { return; } while( list ) { printf("next=%x, rand=%x, value=%d
", int(list->next), int(list->rand), list->value); list = list->next; } printf("
"); } int main() { const int N = 10; Node ns[N]; for(int i = 0; i < N; i++) { if(i < N-1) { ns[i].next = &ns[i+1]; } else { ns[i].next = NULL; } ns[i].rand = &ns[rand() % N]; ns[i].value = i; } print_list(ns); Node* copied = copy_list_with_rand_ptr(ns); print_list(copied); return 0; }