19.复杂链表的复制
题目内容:
代码及思路:
分析题目,这道题的链表与单向链表不同的是,多了一个指向任意一个节点的指针。以下图的链表为例
1)复制节点
2)复制random连接
3)拆分链表
class Solution{
public:
RandomListNode* copyRandomList(RandomListNode* head)
{
map<RandomListNode*,int> node_map;
vector<RandomListNode*> node_vec; //存放新链表
RandomListNode* ptr=head;
int i=0;
while(ptr)
{
node_vec.push_back(new RandomListNode(ptr->label)); //node_vec存放新链表节点
node_map[ptr]=i; //旧链表节点地址与位置信息
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];
if(ptr->random)
{
int id=node_map(ptr->random);
node_vec[i]->random=node_vec[id];
}
ptr=ptr->next;
i++;
}
return node_vec[0];
}