问题描述:

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。

思路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. /*
  2. public class RandomListNode {
  3. int label;
  4. RandomListNode next = null;
  5. RandomListNode random = null;
  6. RandomListNode(int label) {
  7. this.label = label;
  8. }
  9. }
  10. */
  11. public class Solution {
  12. public RandomListNode Clone(RandomListNode pHead)
  13. {
  14. if(pHead == null){
  15. return null;
  16. }
  17. //复制接结点
  18. CopyList(pHead);
  19. //连接随机指针
  20. ConnectRandom(pHead);
  21. //拆分链表
  22. return ReconnectNodes(pHead);
  23. }
  24. public static void CopyList(RandomListNode pHead){
  25. if(pHead == null){
  26. return;
  27. }
  28. RandomListNode pNode = pHead;
  29. while(pNode != null){
  30. RandomListNode pCloned = new RandomListNode(pNode.label);
  31. pCloned.next = pNode.next;
  32. pCloned.random = null;
  33. pNode.next = pCloned;
  34. pNode = pCloned.next;
  35. }
  36. }
  37. public static void ConnectRandom(RandomListNode pHead){
  38. RandomListNode pNode = pHead;
  39. while(pNode != null){
  40. RandomListNode pCloned = pNode.next;
  41. if(pNode.random != null){
  42. pCloned.random = pNode.random.next;
  43. }
  44. pNode = pCloned.next;
  45. }
  46. }
  47. public static RandomListNode ReconnectNodes(RandomListNode pHead){
  48. RandomListNode pNode = pHead;
  49. RandomListNode pClonedHead = null;
  50. RandomListNode pClonedNode = null;
  51. if(pNode != null){
  52. pClonedHead = pClonedNode = pNode.next;
  53. pNode.next = pClonedNode.next;
  54. pNode = pNode.next;
  55. }
  56. while(pNode != null){
  57. pClonedNode.next = pNode.next;
  58. pClonedNode = pClonedNode.next;
  59. pNode.next = pClonedNode.next;
  60. pNode = pNode.next;
  61. }
  62. return pClonedHead;
  63. }
  64. }

剑指Offer:面试题26——复制复杂的链表(java实现)的更多相关文章

  1. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

  2. 剑指offer面试题26:复杂链表的复制

    题目:请实现一个函数,复制一个复杂链表. 在复杂链表中,每个结点除了有一个next指针指向下一个结点外,还有一个sibling指针指向链表中的任意结点或者nulL 直观解法: 1.遍历链表,复制链表节 ...

  3. 剑指offer——面试题26:判断二叉树B是否为二叉树A的子结构

    #include"iostream" #include"stdio.h" #include"math.h" using namespace ...

  4. 剑指offer——面试题18.1:删除链表中重复的节点

    // 面试题18(二):删除链表中重复的结点 // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复 // 结点被删除之后,链表如图3.4(b)所示. #include &l ...

  5. 剑指Offer面试题:31.两个链表的第一个公共节点

    一.题目:两个链表的第一个公共节点 题目:输入两个链表,找出它们的第一个公共结点. 链表结点定义如下,这里使用C#语言描述: public class Node { public int key; p ...

  6. 剑指Offer:面试题30——最小的k个数(java实现)

    问题描述: 输入n个整数,找出其中最小的k个数 思路1: 先排序,再取前k个 时间复杂度O(nlogn) 下面给出快排序的代码(基于下面Partition函数的方法) public void Quic ...

  7. 剑指Offer:面试题11——数值的整数次方(java实现)

    题目描述: 实现函数double Power(double base, int exponent),求base的exponent次方,不得使用库函数,同时不需要考虑大数问题 思路:本题的重点考察内容是 ...

  8. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  9. 剑指offer面试题3 二维数组中的查找(c)

    剑指offer面试题三:

随机推荐

  1. RSS

    RSS的基本概念 什么是RSS,RSS是在线共享内容的一种简易方式(也叫聚合内容,Really Simple Syndication).网站提供RSS输出有利于让用户获取网站内容的最新更新.用户可以使 ...

  2. fifo read

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types. ...

  3. (转)javascript匿名函数的写法、传参和递归

    (原)http://www.veryhuo.com/a/view/37529.html (转)javascript匿名函数的写法.传参和递归 http://www.veryhuo.com 2011-0 ...

  4. 关于工伤事故索赔计算很好用的一款APP

    关于工伤事故索赔计算很好用的一款APP.详细介绍工伤伤残等级评估 工伤计算器根据国家颁布<劳动能力鉴定 职工工伤与职业病致残等级>,通过关键字检索,快速评估工伤伤残等级. 软件说明:  1 ...

  5. 详解<a>标签

    相信对于学前端的人而言<a>标签并不陌生,我们先把他所有的属性列出来 一.主要属性 一般来说,a标签有着四种状态,分别是link,hover,active,visited,接下来我会仔细讲 ...

  6. 日常笔记 ---- 图形学-Frenel函数材质球实现方式

    图形学-Frenel函数材质球实现方式   调个材质 大概公式 自发光= 自定义边光颜色* ((1-法线与视角方向点乘)的 自定义幂次方 ) 这个是比较简单方法   模型的法线与视角方向 角度越大 表 ...

  7. 来自HeroKu的HTTP API 设计指南(中文版)

    原文转自:http://get.jobdeer.com/343.get 来自HeroKu的HTTP API 设计指南(中文版) 翻译 by @Easy 简介 本指南中文翻译者为 @Easy ,他是国内 ...

  8. [转]http://makefiletutorial.com/

    Intro This makefile will always run. The default target is some_binary, because it is first. some_bi ...

  9. 基于redis的排行榜设计和实现

    前言: 最近想实现一个网页闯关游戏的排行榜设计, 相对而言需求比较简单. 秉承前厂长的训导: “做一件事之前, 先看看别人是怎么做的”. 于是乎网上搜索并参考了不少排行榜的实现机制, 很多人都推荐了r ...

  10. VoxelGrid体素滤波器对点云进行下采样

    使用体素化网格方法实现下采样,即减少点的数量,减少点云数据,并同时保持点云的形状特征,在提高配准.曲面重建.形状识别等算法速度中非常实用. PCL实现的VoxelGrid类通过输入的点云数据创建一个三 ...