欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

复制带随机指针的链表(新老节点交替)

程序员文章站 2022-04-15 18:52:53
题目给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的 深拷贝。我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:val:一个表示 Node.val 的整数。random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。示例 :输入:head = [[3,null],[3,0],[3,null]]输出:[[...

题目

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的 深拷贝。
我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

  • val:一个表示 Node.val 的整数。
  • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。

示例 :
复制带随机指针的链表(新老节点交替)
输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]

提示:
1、-10000 <= Node.val <= 10000;
2、Node.random 为空(null)或指向链表中的节点;
3、节点数目不超过 1000 。

注意点

解题步骤:
1、在每一个节点之后插入新节点(新老节点交替)
复制带随机指针的链表(新老节点交替)
2、更新所有新节点的随机节点

  • 我们发现新节点都在老节点的后边,所以,如果存在随机节点,则新节点的随机节点就在老节点的随机节点之后。

复制带随机指针的链表(新老节点交替)
3、分割两个链表
复制带随机指针的链表(新老节点交替)

实现

/*
// Definition for a Node.
class Node {
    int val;
    Node next;
    Node random;

    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}
*/

class Solution {
    public Node copyRandomList(Node head) {
        if (head == null) {
            return null;
        }

		// 在每一个节点之后插入新节点(新老节点交替)
        Node p = head;
        while (p != null) {
        	// 创建新节点(深拷贝)
            Node newNode = new Node(p.val);
        	//插入新节点
            newNode.next = p.next;
            p.next = newNode;
            p = newNode.next;
        }

		// 更新所有新节点的随机节点
        p = head;
        while (p != null) {
        	// 判断老节点是否存在随机节点
            if (p.random != null) {
            	//有,则更新新节点的随机节点
                p.next.random = p.random.next;
            }
            p = p.next.next;
        }

		// 分割两个链表
        p = head;
        Node dumpy = new Node(-1);
        Node newHead = dumpy;
        while (p != null) {
            newHead.next = p.next;
            newHead = newHead.next;
            p.next = newHead.next;
            p = p.next;
        }

		// 返回结果链表
        return dumpy.next;
    }
}

本文地址:https://blog.csdn.net/weixin_43857345/article/details/109646355