剑指Offer:面试题26——复制复杂的链表(java实现)
2016-07-07 17:44
579 查看
问题描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
思路1:
1.先复制链表节点,并用next链接起来。
2.然后对每一个结点去修改它的随机指针S。遍历链表找到S。
时间复杂度O(n^2)
思路2:
1.先复制链表节点N-N’,并用next链接起来,并用一个哈系表存储《N, N‘》结点对,
2.然后对每一个结点去修改它的随机指针S。此时,我们根据哈系表很容易添加每个复制节点的random指针。
时间复杂度O(n),空间复杂度O(n)
思路3:
在思路2的基础上,不使用额外的内存空间。
1.复制原始链表结点N—-》N’,并把N‘插入到N的后面。
2.那么原来的随机指针N-》S ,此刻就应该变为:N’-S‘,显然都是很容易获得的。
3.把上述链表拆分成两个链表,一个是原来的链表,一个是新复制的链表。
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
思路1:
1.先复制链表节点,并用next链接起来。
2.然后对每一个结点去修改它的随机指针S。遍历链表找到S。
时间复杂度O(n^2)
思路2:
1.先复制链表节点N-N’,并用next链接起来,并用一个哈系表存储《N, N‘》结点对,
2.然后对每一个结点去修改它的随机指针S。此时,我们根据哈系表很容易添加每个复制节点的random指针。
时间复杂度O(n),空间复杂度O(n)
思路3:
在思路2的基础上,不使用额外的内存空间。
1.复制原始链表结点N—-》N’,并把N‘插入到N的后面。
2.那么原来的随机指针N-》S ,此刻就应该变为:N’-S‘,显然都是很容易获得的。
3.把上述链表拆分成两个链表,一个是原来的链表,一个是新复制的链表。
/* 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) { if(pHead == null){ return null; } //复制接结点 CopyList(pHead); //连接随机指针 ConnectRandom(pHead); //拆分链表 return ReconnectNodes(pHead); } public static void CopyList(RandomListNode pHead){ if(pHead == null){ return; } RandomListNode pNode = pHead; while(pNode != null){ RandomListNode pCloned = new RandomListNode(pNode.label); pCloned.next = pNode.next; pCloned.random = null; pNode.next = pCloned; pNode = pCloned.next; } } public static void ConnectRandom(RandomListNode pHead){ RandomListNode pNode = pHead; while(pNode != null){ RandomListNode pCloned = pNode.next; if(pNode.random != null){ pCloned.random = pNode.random.next; } pNode = pCloned.next; } } public static RandomListNode ReconnectNodes(RandomListNode pHead){ RandomListNode pNode = pHead; RandomListNode pClonedHead = null; RandomListNode pClonedNode = null; if(pNode != null){ pClonedHead = pClonedNode = pNode.next; pNode.next = pClonedNode.next; pNode = pNode.next; } while(pNode != null){ pClonedNode.next = pNode.next; pClonedNode = pClonedNode.next; pNode.next = pClonedNode.next; pNode = pNode.next; } return pClonedHead; } }
相关文章推荐
- Java公司面试题集锦(四)
- 剑指offer-4-面试21:包含min函数的栈
- 对代码不满足,是任何真正有天才的程序员的根本特征
- 剑指Offer:面试题25——二叉树中和为某一值的路径(java实现)
- Java公司面试题集锦(三)
- 程序员常常登录的技术网站
- 说的烂掉的面试话语 "看源码"
- .NET面试题系列[3] - C# 基础知识(1)
- 一个面试官的忠言..
- 黑马程序员_Java基础_我的Day07学习笔记
- 高级MySQL数据库面试问题 附答案
- java面试题
- 剑指Offer:面试题24——二叉搜索树的后序遍历序列(java实现)
- 面试题24:二叉搜索树后序遍历
- 适用于Java程序员的10道XML面试题 新鲜出炉
- 黑马程序员——反射
- 面试题(单例模式两种写法)
- 剑指offer-4-面试题20:顺时针打印矩阵(画图使抽象问题形象化)
- 剑指Offer:面试题23——从上往下打印二叉树(java实现)
- 转载与一位在多个知名互联网公司面试过的工程师在阿里面试的经历 由此来勉励自己。