欢迎光临
我们一直在努力

Java复杂链表的示例分析

这篇文章将为大家详细讲解有关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复杂链表的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

    赞(0)
    【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。