题解 | #复杂链表的复制#
复杂链表的复制
http://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba
非hashmap和旧链表中创建新链表
简单来说,就是创建两个新vector存储原链表的label和random->label;
然后开始按照label创建新链表,创建完新链表之后,遍历新链表,对于每一个节点,通过判断random->label的值来重新遍历来找到先前连接关系的那个点,然后进行连接。
复杂度为n^2;
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead) {
if(!pHead)return pHead;
vector<int>lab,ran;
RandomListNode* now=pHead;
while(now){
lab.push_back(now->label);
if(now->random){
ran.push_back(now->random->label);
}else ran.push_back(0);
now=now->next;
}
//第一次遍历,此前为旧链表的label和random分别存储到两个vector中进行存储。
RandomListNode* head=new RandomListNode(lab[0]),*tem=head;
for(int i=1;i<lab.size();i++){
tem->next=new RandomListNode(lab[i]);
tem=tem->next;
}
//创建新链表,按照之前的label vector复制。
tem=head;
RandomListNode* tes;
for(int i=0;i<ran.size();i++){
if(ran[i]){
tes=head;
for(int j=0;j<ran.size();j++){
if(tes->label==ran[i]){
tem->random=tes;
break;
}
tes=tes->next;
}
}
tem=tem->next;
}
return head;
}
};
基恩士成长空间 446人发布