原题地址:https://leetcode-cn.com/problems/copy-list-with-random-pointer/description/
题目描述:
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的深度拷贝。
解题思路:
首先要区别浅拷贝和深拷贝之间的区别:浅拷贝是拷贝一引用,而深拷贝拷贝的不仅仅是引用,还包括引用所属的值,简单的说就说拷贝另一份。
本题,需要利用容器Map完成random指针的记录,利用容器vector记录每个节点的编号。
代码:
/**
* 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) {
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];
}
};