剑指offer:复杂链表的复制
2015-11-20 16:15
465 查看
题目描述:输入一个复杂链表,每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点(可能为NULL),求输出复杂链表的拷贝(返回拷贝链表的头结点即可)
思路:一般复制一个简单链表就这么遍历一遍就好了,这个复杂链表,比简单链表多的地方就在于多了一个random的指针,也就是说在建立完简单链表之后,如何在新的链表中找到random对应的地址。我们已知的是旧的节点的地址,所以只需要用一个map,保存每一个节点旧的节点对应的新的节点的地址即可。
第一次遍历,建立简单节点,第二次遍历,对于旧链表中的每一个节点的random指针地址,从map中找到新链表中对应节点的地址,连接上就好了。
思路:一般复制一个简单链表就这么遍历一遍就好了,这个复杂链表,比简单链表多的地方就在于多了一个random的指针,也就是说在建立完简单链表之后,如何在新的链表中找到random对应的地址。我们已知的是旧的节点的地址,所以只需要用一个map,保存每一个节点旧的节点对应的新的节点的地址即可。
第一次遍历,建立简单节点,第二次遍历,对于旧链表中的每一个节点的random指针地址,从map中找到新链表中对应节点的地址,连接上就好了。
#include<iostream> #include<map> using namespace std; struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { } }; class Solution { public: RandomListNode* Clone(RandomListNode* pHead) { if (!pHead) return NULL; RandomListNode * res = new RandomListNode(pHead->label); RandomListNode * tmp = res; RandomListNode * p = pHead; map<RandomListNode *, RandomListNode *> m; m[p] = res; //tmp = tmp->next; p = p->next; while (p) { //tmp = new RandomListNode(p->label); //m[p] = tmp; //tmp = tmp->next; //p = p->next; RandomListNode * newNode = new RandomListNode(p->label); tmp->next = newNode; tmp = newNode; m[p] = tmp; p = p->next; } p = pHead; tmp = res; while (p) { if (p->random) tmp->random = m.find(p->random)->second; tmp = tmp->next; p = p->next; } return res; } }; void deleteList(RandomListNode * pHead) { while (pHead != NULL) { RandomListNode * p = pHead->next; delete pHead; pHead = p; } } int main() { RandomListNode * p1 = new RandomListNode(1); RandomListNode * p2 = new RandomListNode(2); RandomListNode * p3 = new RandomListNode(3); RandomListNode * p4 = new RandomListNode(4); RandomListNode * p5 = new RandomListNode(5); p1->next = p2; p2->next = p3; p3->next = p4; p4->next = p5; p5->next = NULL; p1->random = p3; p2->random = p4; p3->random = NULL; p4->random = p2; p5->random = NULL; Solution s; RandomListNode * newHead = s.Clone(p1); deleteList(newHead); deleteList(p1); return 0; }
相关文章推荐
- css中width与继承的关系
- 推荐12个最好的 JavaScript 图形绘制库
- js调试技巧
- 屏蔽浏览器自动填充样式
- Populating Next Right Pointers in Each Node
- css常用e设置
- 2、手把手教你Extjs5(二)项目中文件的加载过程
- 对Bootstrap的一点点认识
- JSON.parse()和JSON.stringify()
- 前端学习网址
- JS 把数字转换成字母
- CSS样式呈现优先级
- jsoup 简介
- CSS3动画第二式--组合动画
- jquery地图插件jvectorMap
- hbase for hadoop2.X 使用 protocolbuffer 自定义filter
- AngularJS的作用域Scope基础
- 使用Javascript/jQuery将javascript对象转换为json格式数据
- AngularJS 的 Scope
- ABAP内表数据和JSON格式互转