复杂链表的复制
来源:互联网 发布:mac excel 公式不计算 编辑:程序博客网 时间:2024/05/29 15:14
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
算法:
第一种:使用辅助空间,复制链表的时候把原链表和新链表一一对应起来。这样当找random 的时候,新链表的random可以通过原链表的random的哈希值取得。
class Solution {public: RandomListNode* Clone(RandomListNode* pHead) { RandomListNode* pNewHead = new RandomListNode(0); RandomListNode* pnew = new RandomListNode(0); pNewHead->next = pnew; if(pHead == NULL) return pHead; RandomListNode* pold = pHead; map<RandomListNode*,RandomListNode*> randomcache; while(pold != NULL){ RandomListNode* p = new RandomListNode(pold->label); pnew->next = p; randomcache[pold] = p; pold = pold->next; pnew = pnew->next; } //重新开始 pnew = pNewHead->next->next; pold = pHead; int k = 0; while(pnew != NULL){ pnew->random = randomcache[pold->random]; pnew = pnew->next; pold = pold->next; } return pNewHead->next->next; }};
第二种不需要辅助空间,将复制后的链表与原链表紧挨着放在一起,这样原链表的random指向的位置就是新链表的random指针的上一个位置。
class Solution {public: RandomListNode* Clone(RandomListNode* pHead) { if(pHead == NULL) return NULL; //第一步复制链表 RandomListNode* p = pHead; while (p!=NULL){ RandomListNode* pnew = new RandomListNode(p->label); RandomListNode* tmp = p->next; p->next = pnew; pnew->next = tmp; p = tmp; } //第二步,随即指针的指向 p = pHead; while (p!=NULL){ if(p->next!=NULL){ if(p->random!=NULL) p->next->random = p->random->next; else p->next->random = NULL; p = p->next->next; } } //第三步,拆分链表 RandomListNode* pnew = new RandomListNode(0); RandomListNode* q = pnew; p = pHead; int k = 1; while (p->next!=NULL){ q->next = p->next; q = q->next; p = p->next; } return pnew->next; }};
0 0
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复制复杂的链表
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- LeetCode - 70. Climbing Stairs
- SwipeRefreshLayout+RecyclerView实现下拉刷新上拉自动加载
- 【make工程管理器】linux下Make工程管理器简述_学习笔记_004
- eclipse一些实用小技巧
- android debug sp方法
- 复杂链表的复制
- Android中Application类用法
- C++,C,java面试例题
- spark一个版本问题引发的血案(java.lang.NoSuchMethodError: org.apache.spark.ui.SparkUI.addStaticHandler)
- 新生练习3
- Codeforces Round #325 (Div. 2) D bfs
- 125. Valid Palindrome
- PE文件详解之区块表
- 华为机试题【9】-整数分割为2的幂次