Java面试题-实现复杂链表的复制代码分享

 更新时间:2017年10月16日 10:53:54   作者:diu_brother  
这篇文章主要介绍了Java面试题-实现复杂链表的复制代码分享,小编觉得还是挺不错的,具有参考价值,需要的朋友可以了解下。

阿里终面在线编程题,写出来与大家分享一下

        有一个单向链表,每个节点都包含一个random指针,指向本链表中的某个节点或者为空,写一个深度拷贝函数,拷贝整个链表,包括random指针。尽可能考虑可能的异常情况。

算法如下:

/*
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)
  {
    copyNodes(pHead);
    setClonedNodes(pHead);
    return splitNodes(pHead);
  }
    //第一步,复制链表任意结点N并创建新结点N‘,再把N'链接到N的后面
   public static void copyNodes(RandomListNode head){ 
    RandomListNode temp = head;
    while(temp!=null){
     RandomListNode clonedNode = new RandomListNode(0);
     clonedNode.next = temp.next;
     clonedNode.label = temp.label;
     clonedNode.random = null;
     temp.next = clonedNode;
     temp = clonedNode.next;
    }
   }
   //第二步,设置复制出来的结点
   public static void setClonedNodes(RandomListNode head){
    RandomListNode pNode = head;
    while(pNode!=null){
     RandomListNode pCloned = pNode.next;
     if(pNode.random!=null){
      pCloned.random = pNode.random.next; 
     }
     pNode = pCloned.next;
    }
   }
   //第三步,将第二步得到的链表拆分成两个链表
   public static RandomListNode splitNodes(RandomListNode head){
    RandomListNode pNode = head;
    RandomListNode clonedHead = null;
    RandomListNode clonedNode = null;
    if(pNode!=null){
     clonedHead = pNode.next;
     clonedNode = pNode.next;
     pNode.next = clonedNode.next;
     pNode = pNode.next;
    }
    while(pNode!=null){
     clonedNode.next = pNode.next;
     clonedNode = clonedNode.next;
     pNode.next = clonedNode.next;
     pNode = pNode.next;
    }
    return clonedHead;
   }
}

总结

以上就是本文关于Java面试题-实现复杂链表的复制代码分享的全部内容,感兴趣的朋友可以继续参阅:Java输出链表倒数第k个节点Java语言实现反转链表代码示例Java编程实现从尾到头打印链表代码实例以及本站其他相关专题,希望对大家有所帮助。如有不足之处,欢迎留言指出,小编一定及时更正,给大家提供更好的阅读体验及帮助,感谢朋友们对本站的支持!

相关文章

  • Java中的任务调度框架quartz详细解析

    Java中的任务调度框架quartz详细解析

    这篇文章主要介绍了Java中的任务调度框架quartz详细解析,Quartz 是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制,需要的朋友可以参考下
    2023-11-11
  • 2024.1.2 安装JDK和Eclipse并配置java编译环境的过程

    2024.1.2 安装JDK和Eclipse并配置java编译环境的过程

    这篇文章主要介绍了2024.1.2 安装JDK和Eclipse并配置java编译环境,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • java maven中如何引入自己的lib

    java maven中如何引入自己的lib

    在JavaMaven项目中引入自己的库可以简化为几个步骤:首先,确保库以JAR格式存在或打包成JAR;其次,将JAR文件放置在项目目录或安装到本地Maven仓库;最后,在pom.xml中添加依赖,这样做可以使项目更加模块化,便于管理和维护,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • Java数据结构之Map与Set专篇讲解

    Java数据结构之Map与Set专篇讲解

    这篇文章通过实例面试题目来讲解Java中Map和Set之间的关系,具有很好的参考价值,Map与Set在面试中经常会遇到。一起跟随小编过来看看吧
    2022-01-01
  • SpringBoot实现MapperScan添加动态配置(占位符)

    SpringBoot实现MapperScan添加动态配置(占位符)

    这篇文章主要介绍了SpringBoot实现MapperScan添加动态配置(占位符),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • java多线程数据分页处理实例讲解

    java多线程数据分页处理实例讲解

    在本篇内容里小编给大家分享了一篇关于java多线程数据分页处理实例讲解内容,有兴趣的朋友们可以学习下。
    2021-01-01
  • Java之Springcloud Gateway内置路由案例讲解

    Java之Springcloud Gateway内置路由案例讲解

    这篇文章主要介绍了Java之Springcloud Gateway内置路由案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • mac下idea的svn密码记不住的问题及处理方法

    mac下idea的svn密码记不住的问题及处理方法

    这篇文章主要介绍了mac下idea的svn密码记不住的问题及处理方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Java如何使用itext向PDF插入数据和图片

    Java如何使用itext向PDF插入数据和图片

    最近项目中使用到Java实现写入PDF文件,这篇文章主要给大家介绍了关于Java如何使用itext向PDF插入数据和图片的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • Lambda表达式的使用及注意事项

    Lambda表达式的使用及注意事项

    这篇文章主要介绍了Lambda表达式的使用及注意事项,主要围绕 Lambda表达式的省略模式 Lambda表达式和匿名内部类的区别的相关内容展开详情,感兴趣的小伙伴可以参考一下
    2022-06-06

最新评论