题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。
//有一个指针是随机的,random可能指向任意一个结点,所以该结点有可能还没建立,
//因此,处理两次,一次新建结点,将next指向正确的下一个结点,此时,记录下每个
//结点的地址,第二次遍历结点,将random指向正确的结点,当然random可能为空。
//这是需要注意的。
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
RandomListNode* Clone(RandomListNode* pHead)
{
if(pHead==NULL)return NULL;
map<RandomListNode*,int> save_place;
vector<int> save_index;
RandomListNode* ptr=pHead;
int i=0;
//记录下0-(size-1)的地址,关键字用地址,value用index
while(ptr!=NULL)
{
save_place[ptr]=i;
++i;
ptr=ptr->next;
}
//利用刚刚的map,得到每个random指向的是第几个结点(为空则为-1)
ptr=pHead;
while(ptr!=NULL)
{
if(ptr->random!=NULL)
save_index.push_back(save_place[ptr->random]);
else
{
save_index.push_back(-1);
}
ptr=ptr->next;
}
vector<RandomListNode*> save_new;
RandomListNode* pre1=pHead,*pre2=new RandomListNode(pre1->label),*new_head=pre2;
save_new.push_back(pre2);
while(pre1->next!=NULL)
{
pre1=pre1->next;
pre2->next=new RandomListNode(pre1->label);
pre2=pre2->next;
save_new.push_back(pre2);
}
i=0;
pre2=new_head;
while(pre2!=NULL)
{
//取出每个结点random指向结点对应的序号,把该结点的地址赋值给random
if(save_index[i]!=-1)
pre2->random=save_new[save_index[i]];
else
{
pre2->random=NULL;
}
pre2=pre2->next;
++i;
}
return new_head;
}