LeetCode_Copy List with Random Pointer
2014-05-11 19:29
295 查看
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.
链表的基本操作。
思路:由于存在一个random指针,所以要先所有的节点都复制一遍,只有当所有的节点都复制完成后,才能修改随机的指针。
我最出的做法(代码中注释部分),对于随机指针的复制,每次都有遍历一遍链表来确定指针的位置,导致算法的时间复杂的为O(n2),最后提交超时。
在Discuss看到一个牛人的做法,同样是首先完成链表的基本复制,但是复制的时候将新复制生成的节点存储为其原节点的后继,这样对于新复制生成节点的random指针就很容易定位为源节点random的next了。说的有点绕,看代码就什么都明白了。
Return a deep copy of the list.
链表的基本操作。
思路:由于存在一个random指针,所以要先所有的节点都复制一遍,只有当所有的节点都复制完成后,才能修改随机的指针。
我最出的做法(代码中注释部分),对于随机指针的复制,每次都有遍历一遍链表来确定指针的位置,导致算法的时间复杂的为O(n2),最后提交超时。
在Discuss看到一个牛人的做法,同样是首先完成链表的基本复制,但是复制的时候将新复制生成的节点存储为其原节点的后继,这样对于新复制生成节点的random指针就很容易定位为源节点random的next了。说的有点绕,看代码就什么都明白了。
/** * Definition for singly-linked list with a random pointer. * struct RandomListNode { * int label; * RandomListNode *next, *random; * RandomListNode(int x) : label(x), next(NULL), random(NULL) {} * }; */ class Solution { public: //RandomListNode *copyRandomList(RandomListNode *head) { // if (head==NULL) // { // return NULL; // } // // RandomListNode *pCurrent=head->next; // RandomListNode *copyhead=new RandomListNode(head->label); // RandomListNode *pCurrentCopy=copyhead; // //第一遍复制next和数据 // while (pCurrent!=NULL) // { // pCurrentCopy->next=new RandomListNode(pCurrent->label); // pCurrent=pCurrent->next; // pCurrentCopy=pCurrentCopy->next; // } // //第二遍复制random指针 // pCurrent=head; // pCurrentCopy=copyhead; // while (pCurrent!=NULL) // { // RandomListNode *pRandom=pCurrent->random; // if (pRandom!=NULL) // { // RandomListNode *ptemp=head; // RandomListNode *pCopyTemp=copyhead; // while (ptemp!=pRandom) // { // ptemp=ptemp->next; // pCopyTemp=pCopyTemp->next; // } // pCurrentCopy->random=pCopyTemp; // } // pCurrent=pCurrent->next; // pCurrentCopy=pCurrentCopy->next; // } // return copyhead; //} RandomListNode *copyRandomList(RandomListNode *head) { if(head == NULL) return NULL; RandomListNode *p = head; do { RandomListNode *q = p->next; p->next = new RandomListNode(p->label); p->next->next = q; p = q; } while(p != NULL); p = head; do { p->next->random = (p->random == NULL) ? NULL : p->random->next; p = p->next->next; } while(p != NULL); p = head; RandomListNode *r = head->next; for(RandomListNode *q = r;;) { p->next = q->next; p = p->next; if(p == NULL) break; q->next = p->next; q = q->next; } return r; } };
相关文章推荐
- Leetcode:Copy List with Random Pointer
- [LeetCode]Copy List with Random Pointer
- JAVA学习44_leetCode解题报告之Copy List with Random Pointer
- LeetCode:Copy List with Random Pointer
- leetcode: Copy List with Random Pointer
- [LeetCode] Copy List with Random Pointer
- leetcode第一刷_Copy List with Random Pointer
- leetcode -day8 Copy List with Random Pointer & Single Number I II
- Leetcode: Copy List with Random Pointer
- Leetcode: Copy List With Random Pointer分析理解
- leetcode之Copy List with Random Pointer
- LeetCode:Copy List with Random Pointer
- LeetCode_copy-list-with-random-pointer
- LeetCode Copy List with Random Pointer
- Leetcode Copy List with Random Pointer
- Copy List With Random Pointer (LeetCode)
- [LeetCode]138 Copy List with Random Pointer
- LeetCode | Copy List with Random Pointer
- leetcode 138 —— Copy List with Random Pointer
- Leetcode -- Copy List with Random Pointer