LeetCode之copy-list-with-random-pointer

分成三步,1.建立新的结点,插入到原结点的后面。2.将原结点的random复制给新的结点,注意复制的时候是让新结点的random指向新的结点。3.将新的结点从原链表中分离出来
假设原来的链表是 A->B->C->D(忽略random)
第1步之后就成了 A'   B'   C'    D'    这样的位置关系。后面的就不画了,不好写的。
                             |  \  |  \   |  \   |
                            A    B    C     D

/**
 * Definition for singly-linked list with a random pointer.
 * struct RandomListNode {
 *     int label;
 *     RandomListNode *next, *random;
 *     RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
 * };
 */
class Solution {
public:
    RandomListNode *copyRandomList(RandomListNode *head) {
        if(head == nullptr)
            return nullptr;
        
        RandomListNode* node = head;
        //第一步,将新结点插入到原结点的后面
        while(node)
        {
            RandomListNode* new_node = new RandomListNode(node->label);
            new_node->next = node->next;//新结点指向下一个原结点
            node->next = new_node;//原结点指向自己的拷贝
            node = node->next->next;//移动到下一个原结点
        }
        node = head;
        //第二步,复制random
        while(node)
        {
            //如果原结点的random存在,则新结点的random指向node的random的next。注意这里要加next,不加的话就成了新结点的random指向一个旧结点
            if(node->random)
                node->next->random = node->random->next;
            node = node->next->next;//移动到下一个原结点
        }
        
        //第三步,将新的结点从这个链表脱离出来
        RandomListNode* new_head = head->next;
        node = head;
        while(node)
        {
            RandomListNode* new_node = node->next;//这个结点时新的还未和新链表链接好的结点
            node->next = new_node->next;//注意新旧链表结点的顺序
            if(new_node->next)
                new_node->next = node->next->next;
            node = node->next;
        }
        return new_head;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_22080999/article/details/80443302