问题:

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

Return a deep copy of the list.

结点的定义如下:

/** 
* Definition for singly-linked list with a random pointer. 
* class RandomListNode { 
*     int label; 
*     RandomListNode next, random; 
*     RandomListNode(int x) { this.label = x; } 
* }; 
*/

分析:

原来的链表的结构如下图所示:

注意一点,random的指针可以指向后面的结点,也可以指向前面的结点。

这里提供两种解法:

方法1:用hash表存储结点信息,时间O(2n),空间O(n)

第一次遍历原链表,并构建random为null的新链表,于此同时在hash表中存储原结点和新结点的地址信息,原结点地址为key,新结点地址为value,即map<原结点地址,新结点地址>

第二次遍历原链表,对于random不为空的结点,可以根据random的值,在hash表中找到random指向的节点对应的新结点的地址,再以此给新结点random赋值即可。

方法2:先改变原链表的结构,在恢复,时间O(2n),空间O(1)

这个方法需要3次遍历,

第一次,构建新链表的结点,random为null,并且用原来链表节点的next指向对应的新结点,新结点的next指向原链表的下一个结点,如图所示:

第二次,给新节点的random赋值,

p = head;
while(p!=null){
if(p.random != null){
p.next.random = p.random.next;
}
p = p.next.next;
}

第三次,恢复原链表和新链表的链表结构。

head2 = head.next;
p = head;
while(p!=null){
p2 = p.next;
p.next = p2.next;
if (p2.next != null) p2.next = p2.next.next;
p = p.next;
}

方法2的完整代码:

public class Solution {
public RandomListNode copyRandomList(RandomListNode head) {
if(head == null)return null;
RandomListNode head2,p2,p = head;
while(p!=null){
RandomListNode n = new RandomListNode(p.label);
n.next = p.next;
p.next = n;
p = n.next;
}
p = head;
while(p!=null){
if(p.random != null){
p.next.random = p.random.next;
}
p = p.next.next;
} head2 = head.next;
p = head;
while(p!=null){
p2 = p.next;
p.next = p2.next;
if (p2.next != null) p2.next = p2.next.next;
p = p.next;
}
return head2;
}
}

最新文章

  1. powershell对txt文件的服务器进行ping操作
  2. JS 深度拷贝 Object Array
  3. Xcode 8 打印输出: Class PLBuildVersion is implemented in both...
  4. python 处理文件夹中的文件(新建另一个文件保存),listdir顺序输出
  5. 2.HTML5 标准改变,准备工作
  6. android 跳转到系统设置界面的所有Intent
  7. extjs 简单入门
  8. UILabel自适应高、宽
  9. linux命令 chattr超级权限控件
  10. 去除右键菜单opendlg
  11. 工程建立多个source folder
  12. JS传递参数时对中文进行编码和解码
  13. Android Studio 没有assets目录的问题
  14. weblogic的ejb远程调用
  15. js原生设计模式——2面向对象编程之闭包1
  16. FP-growth算法思想和其python实现
  17. SimpleDateFormat 常用用法
  18. [20190306]奇怪的查询结果.txt
  19. Python爬虫实例(四)网站模拟登陆
  20. MyBatis基础入门《二》Select查询

热门文章

  1. 在 Linux redis 验证交互连接过程中遇到 redis Could not connect to Redis at 127.0.0.1:6379: Connection refused 的解决方法
  2. oracle数据库死锁的查看及解决
  3. 内核程序开发 LED灯顺序点亮、顺序熄灭
  4. ExtJS动态创建组件
  5. maven install 跳过测试
  6. 转载spring restemplate
  7. xsigo systems
  8. Space-vim的.spacevim配置备份
  9. Gitlab 社区版安装部署和维护指南
  10. SQL中INNER JOIN的用法