138 copy list with random pointer

1,对原链表每个节点进行赋值,并插入对每个节点的后面。
2,从头开始对每个新加节点的random位赋值

    if(p->random)
        p->next->random = p->random->next;
    else
        p->next->random = NULL;

3,恢复原链表,同时把新复制的节点保证在新链表并返回。

while(old){
    old->next = old->next->next;
    if(new->next)
        new->next = new->next->next;
    else
        new->next = NULL;
    old = old->next;
    new = new->next;
}
free(dummy);
head = oldhead;
return newhead;         
/**
 * Definition for singly-linked list with a random pointer.
 * struct RandomListNode {
 *     int label;
 *     struct RandomListNode *next;
 *     struct RandomListNode *random;
 * };
 */
struct RandomListNode *copyRandomList(struct RandomListNode *head) {

    if(head == NULL)
        return NULL;
    struct RandomListNode *dummy = calloc(1, sizeof(struct RandomListNode));
    dummy->next = head;

    struct RandomListNode * p = dummy->next;

    while(p){
        struct RandomListNode *node = calloc(1, sizeof(struct RandomListNode));
        node->label = p->label;
        node->next = p->next;
        p->next = node;
        p = p->next->next;
    }


    p = dummy->next;

    while(p){
        if(p->random)
            p->next->random = p->random->next;
        else
            p->next->random = NULL;
        p = p->next->next;
    }

    //restor old

    struct RandomListNode * old = dummy->next;
    struct RandomListNode * oldhead = dummy->next;
    struct RandomListNode * new = dummy->next->next;
    struct RandomListNode * newhead = dummy->next->next;



    while(old){
        old->next = old->next->next;
        if(new->next)
            new->next = new->next->next;
        else
            new->next = NULL;
        old = old->next;
        new = new->next;
    }
    free(dummy);
    head = oldhead;
    return newhead;

}

推荐阅读更多精彩内容