剑指offer——复杂链表的复制
2016-07-28 20:12
441 查看
题目描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路:
第一步,复制原来链表的节点,并设置next指针,这一步不同于简单的复制节点,而是把每个复制的节点都链在原节点的后面,相当于复制节点之间隔了一个原节点;第二步,设置复制节点的特殊指针,由于在第一步做了特殊处理,所以当一个节点R的特殊指针指向节点N的时候,复制节点R’的特殊指针则是N’,这样就可以在O(1)时间定位到R的特殊指针指向的节点;第三步,从链表中抽取出复制节点,由于复制节点是间隔相连的,所以这一步比较好处理。综合以上三个步骤,就完成了复杂链表的复制。代码实现:
/* public class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; RandomListNode(int label) { this.label = label; } } */ public class Solution { public RandomListNode Clone(RandomListNode pHead) { CloneNodes(pHead); ConnectIndexOfNodes(pHead); return ConnectFinalNodes(pHead); } //第一步:复制链表节点 private void CloneNodes(RandomListNode pHead){ RandomListNode node = pHead; while(node != null){ RandomListNode cloneNode = new RandomListNode(node.label); cloneNode.next = node.next; cloneNode.random = null; node.next = cloneNode; node = cloneNode.next; } } //第二步:设置每个节点的随机指针 private void ConnectIndexOfNodes(RandomListNode pHead){ RandomListNode node = pHead; while(node != null){ RandomListNode clone = node.next; if(node.random != null) clone.random = node.random; node = clone.next; } } //第三步:组合复制的节点 private RandomListNode ConnectFinalNodes(RandomListNode pHead){ RandomListNode node = pHead; RandomListNode cloneHead = null; RandomListNode cloneNode = null; // 设置第一个节点 if (node != null) { cloneHead = node.next; cloneNode = node.next; node = node.next = cloneNode.next; } while (node != null) { cloneNode.next = node.next; cloneNode = cloneNode.next; node.next = cloneNode.next; node = node.next; } return cloneHead; } }
相关文章推荐
- CapturePerfect 3.1 和 DR-6030C驱动 iso镜像安装文件
- webpack 不是内部命令
- 《用JavaScript实现幸运大转盘抽奖程序》 一
- JavaScript return false
- 表格点击当前行,在其下边展示其子信息列表(即下拉显示数据)
- 几个KNOCKOUT.JS 框架使用技巧
- Effective Java 之-----谨慎的覆盖clone方法
- bootstrap, boosting, bagging 几种方法的区别与联系
- bootstrap 响应式实用工具
- Jquery给Dom 动态绑定事件
- ES6 Class 类
- 阿里15年前端实习笔试-自己尝试做的答案
- 对h5 css3的更多新的认识
- html Frame、Iframe、Frameset 的区别
- htmld基础标签(1)
- jquery指定div右键事件
- listview的多条目样式适配
- JSP中的EL表达式详细介绍
- Gson高级用法--->对json字符串进行过滤和检查
- 剑指offer——二叉搜索树与双向链表