leetcode 138:复制带随机指针的链表

题目:复制带随机指针的链表

  • 题目描述:
    给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
    要求返回这个链表的深度拷贝。
/**
 * 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) {}l
 * };
 */
class Solution {
public:
    RandomListNode *copyRandomList(RandomListNode *head) {
         std::map<RandomListNode *,int> node_map;  //地址到节点位置的map
         std::vector<RandomListNode *> node_vec; 
        RandomListNode *ptr = head;   //使用vector根据存储节点位置访问地址
        int i = 0;
        while(ptr){   //将新链表节点push入node_vec,生成了新链表节点位置到地址的map
            node_vec.push_back(new RandomListNode(ptr->label));
            node_map[ptr] = i;  //记录原始链表地址至节点位置的node_map
            ptr = ptr->next;
            i++;  //记录节点位置
        }
        node_vec.push_back(0);
        ptr = head;
        i = 0;  //再次遍历原始列表连接新链表的next指针、random指针
        while(ptr){
            node_vec[i]->next = node_vec[i+1];  //连接新链表next指针
            if(ptr->random){   //当random指针不空时
                int id = node_map[ptr->random];  //根据node_map确认原链表random指针指向的位置即id
                node_vec[i]->random = node_vec[id];   //连接新链表random指针
            }
            ptr = ptr->next;
            i++;
        }
        return node_vec[0];
    }
};

猜你喜欢

转载自blog.csdn.net/gjpzl/article/details/80151374