Java复杂链表的复制详解

 更新时间:2022年01月25日 11:49:03   作者:Fly upward  
复杂链表指的是一个链表有若干个结点,每个结点有一个数据域用于存放数据,还有两个指针域,其中一个指向下一个节点,还有一个随机指向当前复杂链表中的任意一个节点或者是一个空结点,我们来探究一下在Java中复杂链表的复制

1.题目

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

题目来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof

2.解法

2.1 拼接+拆分

首先我们逐个将节点复制并且和原来的链表连起来得新链表;

然后再构建新链表的random 指向。当访问原节点 cur 的随机指向节点 cur.random 时,对应新节点 cur.next 的随机指向节点为 cur.random.next 

将得到的新链表之间的复制节点拆分出来连成一个复制链表,拆分成原链表和复制链表。

链表图

 复制节点

 将复制节点的random.next 连接起来

 拆分成两个链表

3.代码

class Solution {
    public Node copyRandomList(Node head) {
        if(head == null) {
            return null;
        }        
        //1.复制各个链表,并连接
        Node cur = head;
        while (cur != null) {
            //复制
            Node prev = new Node(cur.val);
            prev.next = cur.next;
            //连接
            cur.next = prev;
            //往后走
            cur = prev.next;
        }
        //2.构建各新节点的random 指向
        cur = head;
        while (cur != null) {
            if (cur.random != null) {
                cur.next.random = cur.random.next;
            }
            cur = cur.next.next;
        }
        //3.拆分复制的链表
        cur = head.next;
        Node node = head;
        Node nodeNext = head.next;
        while (cur.next != null) {
            node.next = node.next.next;
            cur.next = cur.next.next;
            node = node.next;
            cur = cur.next;
        }
        node.next = null;//尾节点
        return nodeNext;//返回新链表的头结点
    }
}

到此这篇关于Java复杂链表的复制详解的文章就介绍到这了,更多相关Java 复杂链表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 源码解读Mybatis占位符#和$的区别

    源码解读Mybatis占位符#和$的区别

    这篇文章主要介绍了Mybatis占位符#和$的区别通过源码解读,针对笔者日常开发中对 Mybatis 占位符 #{} 和 ${} 使用时机结合源码,思考总结而来,需要的朋友可以参考下
    2023-02-02
  • IDEA消除指定警告的两种方法小结

    IDEA消除指定警告的两种方法小结

    有时候IDEA会代码中给出一些我们不需要的警告,看起来就很不美观,本文主要介绍了IDEA消除指定警告的两种方法,感兴趣的可以了解一下
    2023-08-08
  • SpringBoot请求参数接收方式

    SpringBoot请求参数接收方式

    这篇文章主要介绍了SpringBoot请求参数接收方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • jpa异常No entity found for query问题解决

    jpa异常No entity found for query问题解决

    这篇文章主要为大家介绍了jpa异常之No entity found for query的异常问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • 快速了解Hibernate中的Session

    快速了解Hibernate中的Session

    这篇文章主要介绍了快速了解Hibernate中的Session,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • spring的TransactionSynchronizationAdapter事务源码解析

    spring的TransactionSynchronizationAdapter事务源码解析

    这篇文章主要介绍了spring的TransactionSynchronizationAdapter事务源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • java高效文件流读写操作详解

    java高效文件流读写操作详解

    这篇文章主要介绍了java高效文件流读写操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 应用市场中Java拦截器和切面的使用实例详解

    应用市场中Java拦截器和切面的使用实例详解

    这篇文章主要介绍了应用市场中Java拦截器和切面的使用实例详解,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java类初始化顺序详解

    Java类初始化顺序详解

    这篇文章主要介绍了Java类初始化顺序详解,java语言在使用过程中最先开始就是初始化,在工作中如果遇到什么问题需 要定位往往到最后也可能是初始化的问题,因此掌握初始化的顺序很重要,需要的朋友可以参考下
    2023-08-08
  • Mybatis-plus 批量插入太慢的问题解决(提升插入性能)

    Mybatis-plus 批量插入太慢的问题解决(提升插入性能)

    公司使用的Mybatis-Plus操作SQL,用过Mybatis-Plus的小伙伴一定知道他有很多API提供给我们使用,但是批量插入大数据太慢应该怎么解决,本文就详细的介绍一下,感兴趣的可以了解一下
    2021-11-11

最新评论