复制带随机指针的链表(新老节点交替)
程序员文章站
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
推荐阅读
-
剑指offer25:复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),结果返回复制后复杂链表的head。
-
138:复制带随机指针的链表
-
LeetCode 138. 复制带随机指针的链表
-
剑指offer25:复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),结果返回复制后复杂链表的head。
-
复杂链表的复制(链表的每个结点,有一个next指针指向下一个结点,还有一个random指针指向这个链表中的一个随机结点或者NULL)
-
复制带随机指针的链表(新老节点交替)
-
LeetCode 138. 复制带随机指针的链表