输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的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;
3、将链表拆分成原链表和复制后的链表
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; } };