复杂链表的复制
2016-05-04 15:55
253 查看
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向链表中任意一个节点)。链表的数据结构为
思路:首先复制next节点,然后复制random节点。
方法一:在复制节点的时候,将原节点A和复制节点A’加入到HashMap (A,A’)当中保存,然后复制random节点时,遍历原链表,当原节点存在random节点时,则从HashMap当中找出复制节点的random’节点。
方法二:如图所示为原链表
第一步复制节点
第二步复制random节点
第三步拆分
方法一:
方法二:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向链表中任意一个节点)。链表的数据结构为
public class RandomListNode { public int label; public RandomListNode next = null; public RandomListNode random = null; public RandomListNode(int label) { this.label = label; } }
思路:首先复制next节点,然后复制random节点。
方法一:在复制节点的时候,将原节点A和复制节点A’加入到HashMap (A,A’)当中保存,然后复制random节点时,遍历原链表,当原节点存在random节点时,则从HashMap当中找出复制节点的random’节点。
方法二:如图所示为原链表
第一步复制节点
第二步复制random节点
第三步拆分
方法一:
public RandomListNode Clone(RandomListNode pHead){ if(pHead==null){ return null; } RandomListNode head=new RandomListNode(pHead.label); RandomListNode piterator=pHead; RandomListNode iterator=head; //复制next指针 HashMap<RandomListNode,RandomListNode> map=new HashMap<RandomListNode,RandomListNode>(); map.put(piterator, iterator); while(piterator.next!=null){ iterator.next=new RandomListNode(piterator.next.label); iterator=iterator.next; piterator=piterator.next; map.put(piterator, iterator); } //复制random指针 piterator=pHead; iterator=head; while(piterator!=null){ if(piterator.random!=null){ iterator.random=map.get(piterator.random); } iterator=iterator.next; piterator=piterator.next; } return head; }
方法二:
public RandomListNode Clone(RandomListNode pHead){ if(pHead==null){ return null; } RandomListNode piterator=pHead; //合并 while(piterator!=null){ RandomListNode node=new RandomListNode(piterator.label); node.next=piterator.next; piterator.next=node; piterator=node.next; } //random指针复制 piterator=pHead; while(piterator!=null){ if(piterator.random!=null){ piterator.next.random=piterator.random.next; } piterator=piterator.next.next; } //拆分 piterator=pHead; RandomListNode head=pHead.next; RandomListNode iterator=head; while(piterator!=null){ piterator.next=iterator.next; piterator=piterator.next; if(piterator!=null){ iterator.next=piterator.next; iterator=iterator.next; } } return head; }
相关文章推荐
- 优秀网络安全从业者的五项核心技能
- 【Java】Java CSV操作代码
- boost仅运行一次的例程
- Android Json解析
- JavaScript 复选框全选和反选
- windows客户端性能测试之内存泄露检查工具umdh.exe
- HDU 1176 免费馅饼
- cmd used in sql tests (sql学习指南)
- mysql忘记密码时如何修改root用户密码
- PG sys function
- Maven No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 问题
- 常用正则表达式大全,手机、电话、邮箱、身份证(最严格的验证)、IP地址、网址、日期等,一般前台js验证,来这里就够了...
- Jquery ui datepicker设置日期范围,如只能隔3天【实现代码】
- javaweb学习总结(三十四)——使用JDBC处理MySQL大数据
- 对象转JSONArray,JSONObject[包括对象中日期格式化,属性过滤]
- 增强Eclipse、MyEclipse的代码自动提示功能
- jgit pull 分之代码
- CSS样式表
- ionic js学习笔记
- ZOJ 3331 Process the Tasks(双塔DP)