leetcode copy list with random pointer
来源:互联网 发布:外汇数据接口api 编辑:程序博客网 时间:2024/06/05 05:08
不太熟练,拖了几天终于AC了。不过空间复杂度略高。。
struct RandomListNode { int label; RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) {} };RandomListNode *copyRandomList(RandomListNode *head) {RandomListNode *cp = NULL;vector<int> labs;vector<RandomListNode *> randList;if(!head)return cp;labs.push_back(head->label);head->label = 0;cp = new RandomListNode(0);int i = 0;RandomListNode *pcp=cp, *phead=head;//tag nodeswhile(phead->next){i++;RandomListNode *newcp = new RandomListNode(i);labs.push_back(phead->next->label);pcp->next = newcp;phead->next->label= i;phead = phead->next;randList.push_back(pcp);pcp = newcp;}randList.push_back(pcp);//set random pointspcp = cp;phead = head;RandomListNode *tmp = cp;i = 0;while(phead){if(phead->random){pcp->random = randList[phead->random->label];}phead = phead->next;pcp = pcp->next;i++;}//reset labels i = 0;pcp = cp;phead = head;while(phead){phead->label = labs[i];pcp->label = labs[i];phead = phead->next;pcp = pcp->next;i++;}return cp;}
leetcode上也有一些非常取巧的办法,比如利用指针地址都是连续的,然后取新链表和原链表的地址差,从而可以快速深拷贝,空间复杂度还很低:
RandomListNode *copyRandomList(RandomListNode *head) { if(head == NULL) return NULL; RandomListNode *newHead = new RandomListNode(head->label); newHead->random = head->random; head->label = newHead - head; RandomListNode *p = head->next, *q = newHead, *t; while(p) { t = new RandomListNode(p->label); t->random = p->random; p->label = t - p; q->next = t; q = t; p = p->next; } q = newHead; while(q) { if(q->random) q->random = q->random + q->random->label; q = q->next; } p = head; q = newHead; while(p) { p->label = q->label; p = p->next; q = q->next; } return newHead;}
当然最厉害的还是重合的思想,都是奇思妙想啊:
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;}
0 0
- [leetcode][list] 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
- 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
- [LeetCode] Copy List with Random Pointer
- LeetCode OJ:Copy List with Random Pointer
- LeetCode(138)Copy List with Random Pointer
- [LeetCode] - Copy List with Random Pointer
- 2014年7月15日中午笔记
- VC++学习心得(九)
- 使用java画出宝马图标代码
- Zend Studio 10 代码格式化配置
- ubuntu引导修改
- leetcode copy list with random pointer
- Unity3D之利用C#实现代理模式
- ShareSDK for Android 2.3.11已经发布
- HEVC,VP9,x264性能对比 .
- Oracle直接路径加载
- 表单验证学习
- AutoCAD.NET创建对象之绘制圆弧
- 关于自己
- jQuery 操作复选框(checkbox) attr checked不起作用