輸入一個複雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針指向任意一個節點),返回結果爲複製後複雜鏈表的head。
方法1:先按next建立好初始鏈表,然後從頭結點開始遍歷原鏈表每個節點的random指針需要走幾步,在新建立的鏈表中走同樣的步數建立random指針。
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
int find(RandomListNode* a,RandomListNode* b){
int sum=0;
while(a!=b){
a=a->next;
sum++;
}
return sum;
}
public:
RandomListNode* Clone(RandomListNode* pHead)
{
if(pHead==NULL)
return NULL;
RandomListNode* he=pHead;
RandomListNode* head1=new RandomListNode(he->label);
RandomListNode* p=head1;
RandomListNode* q=pHead;
while(q->next){
p->next=new RandomListNode(q->next->label);
p=p->next;
q=q->next;
}
p=head1;
q=pHead;
while(p){
if(q->random==NULL){
p->random=NULL;
}
else{
RandomListNode* po=head1;
for(int i=0;i<find(pHead,q->random);i++){
po=po->next;
}
p->random=po;
}
p=p->next;
q=q->next;
}
return head1;
}
};
方法2:
1、複製每個節點,如:複製節點A得到A1,將A1插入節點A後面
2、遍歷鏈表,A1->random
= A->random->next;
RandomListNode* Clone(RandomListNode* pHead)
{
if(!pHead) return NULL;
RandomListNode *currNode = pHead;
while(currNode){
RandomListNode *node = new RandomListNode(currNode->label);
node->next = currNode->next;
currNode->next = node;
currNode = node->next;
}
currNode = pHead;
while(currNode){
RandomListNode *node = currNode->next;
if(currNode->random){
node->random = currNode->random->next;
}
currNode = node->next;
}
//拆分
RandomListNode *pCloneHead = pHead->next;
RandomListNode *tmp;
currNode = pHead;
while(currNode->next){
tmp = currNode->next;
currNode->next =tmp->next;
currNode = tmp;
}
return pCloneHead;
}
};
方法3:
map關聯:將一對複製的節點<N,N'>關聯起來,可以直接根據N->random找到N'->random
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
if(pHead==NULL) return NULL;
map<RandomListNode*,RandomListNode*> m;
RandomListNode* pHead1 = pHead;
RandomListNode* pHead2 = new RandomListNode(pHead1->label);
RandomListNode* newHead = pHead2;
m[pHead1] = pHead2;
while(pHead1){
if(pHead1->next) pHead2->next = new RandomListNode(pHead1->next->label);
else pHead2->next = NULL;
pHead1 = pHead1->next;
pHead2 = pHead2->next;
m[pHead1] = pHead2;
}
pHead1 = pHead;
pHead2 = newHead;
while(pHead1){
pHead2->random = m[pHead1->random];
pHead1 = pHead1->next;
pHead2 = pHead2->next;
}
return newHead;
}
};