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

2022-07-27,,,,

题目

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的 深拷贝。
我们用一个由 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

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

下载本文的Word格式文档,以方便收藏与打印。