复杂链表的复制(二)
2015-12-14 23:11
218 查看
有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。
思路:
如果没有random pointer那是极容易的,顺着链表走读一遍 ,逐个拷贝节点并链接即可,有了random pointer后,其实也就是加上了记录random pointer的关系而已,考虑到random pointer可以往前指,也可以往后指,则必须全部遍历完才能完整地建立起random pointer对应关系表,记录对应关系,当然用map的数据结构啦,c++不太熟,查了下文档也不难写这么个基本的数据结构,用两个map,一个保存原始链表的random指向,另一个记录原始链表和新建链表按照节点顺序建立的对应关系,这样在走读完原始链表所有节点后,再刷一遍两个map就可以恢复新建链表中与原始链表random指向对应的random 指针了,为了省空间,当然map的元素都用int*表示
思路:
如果没有random pointer那是极容易的,顺着链表走读一遍 ,逐个拷贝节点并链接即可,有了random pointer后,其实也就是加上了记录random pointer的关系而已,考虑到random pointer可以往前指,也可以往后指,则必须全部遍历完才能完整地建立起random pointer对应关系表,记录对应关系,当然用map的数据结构啦,c++不太熟,查了下文档也不难写这么个基本的数据结构,用两个map,一个保存原始链表的random指向,另一个记录原始链表和新建链表按照节点顺序建立的对应关系,这样在走读完原始链表所有节点后,再刷一遍两个map就可以恢复新建链表中与原始链表random指向对应的random 指针了,为了省空间,当然map的元素都用int*表示
/** * 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; } std::map<RandomListNode*, RandomListNode*> parall; std::map<RandomListNode*, RandomListNode*> randpoint; RandomListNode * pleft=head; RandomListNode * copyList=new RandomListNode(pleft->label); RandomListNode * pright=copyList; parall.insert(std::pair<RandomListNode*,RandomListNode*>(pleft,pright)); randpoint.insert(std::pair<RandomListNode*,RandomListNode*>(pleft,pleft->random)); pleft=pleft->next; while(pleft!=NULL) { //create corresponding node RandomListNode* tmpRight=new RandomListNode(pleft->label); pright->next=tmpRight; pright=pright->next; parall.insert(std::pair<RandomListNode*,RandomListNode*>(pleft,pright)); randpoint.insert(std::pair<RandomListNode*,RandomListNode*>(pleft,pleft->random)); pleft=pleft->next; } for( std::map<RandomListNode*, RandomListNode*>::iterator ii=randpoint.begin(); ii!=randpoint.end(); ++ii) { if((*ii).second!=NULL) { parall[(*ii).first]->random=parall[(*ii).second]; } } return copyList; } };
相关文章推荐
- How do I get this result via SNMP?
- C#调用VC的DLL的接口函数参数类型转换一览表
- 字符串中最长无重复字符的子串
- simple string class
- 读懂人生
- Hive中的partition table
- MyBatis和Hibernate的比较
- Office Web Apps Server 概述
- 【JavaWeb笔记】Servlet的生命周期
- Struts2-由于没有添加默认的拦截器导致拦截器出现为空的异常
- XML_JSON数据解析
- 谱聚类Ng算法的Matlab简单实现
- FrameLayout 应用
- 【JavaWeb笔记】部署Srevlet
- 通信原理实践(六)——基带传输
- 亲自安装opencv2.4.9(vs2012+64位操作系统)
- Struts2 Interceptor的例子
- 自己动手写cocos2dx游戏引擎(四)——窗体GLView
- 小KTV学习-1
- 复杂链表的复制