Copy List with Random Pointer
A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
___________________________________________________________________________________________________________________
按照思路 1 实现,时间复杂度0(n^2),超时。
思路 2 实现代码如下:
RandomListNode *copyRandomList(RandomListNode *head) { if(NULL==head){ return head; } //复制原始链表上的每个链表 并用 next 链接起来 RandomListNode* Nhead = new RandomListNode(head->label); RandomListNode* iter = head; RandomListNode* Niter = Nhead; map<RandomListNode*,RandomListNode*> NodeMap; NodeMap[head] = Nhead; while(iter->next != NULL){ Niter->next = new RandomListNode(iter->next->label); iter = iter->next; Niter = Niter->next; NodeMap[iter] = Niter; } //定位每个结点的m_pSibling iter = head; Niter = Nhead; while(iter != NULL){ RandomListNode* TempRand = iter->random; if(TempRand==NULL){ Niter->random = NULL; } else{ Niter->random = NodeMap[iter->random]; } iter = iter->next; Niter = Niter->next; } return Nhead; }
思路三实现参照了这里的代码 。实现过程中有 2 个地方(标注在代码中)需要注意,代码如下:
void cloneNodes(RandomListNode* head){ if(NULL==head){ return; } RandomListNode* iter = head; while(iter != NULL){ RandomListNode* node = new RandomListNode(iter->label); node->next = iter->next; iter->next = node; iter = node->next; } } void connectRandomNodes(RandomListNode* head){ if(NULL==head){ return; } RandomListNode* iter = head; RandomListNode* copyIter = head->next; while(iter != NULL){ if(iter->random != NULL){ copyIter->random = iter->random->next; }else{ copyIter->random = NULL; } iter = copyIter->next; if(iter != NULL){ // important!!! copyIter = iter->next; } } } RandomListNode* reconnectNodes(RandomListNode* head){ if(NULL==head){ return head; } RandomListNode* iter = head; RandomListNode* copyIter = head->next; RandomListNode* Nhead = head->next; while(iter != NULL){ iter->next = copyIter->next; iter = iter->next; if(iter != NULL){ // important!!! copyIter->next = iter->next; copyIter = iter->next; } } return Nhead; } RandomListNode *copyRandomList(RandomListNode *head) { cloneNodes(head); connectRandomNodes(head); return reconnectNodes(head); }