复杂链表的复制
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 44 ms, 内存: 15.6 MB
/*
* Java Stream不适合处理复杂链表的复制问题,因此这里提供一种简化的非标准实现。
* 思路:
* 1. 使用HashMap来存储原节点与新节点之间的映射关系。
* 2. 先复制所有的节点,然后复制所有的next和random指针。
*/
import java.util.*;
class Node {
int val;
Node next;
Node random;
Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
public Node copyRandomList(Node head) {
if (head == null) return null;
Map<Node, Node> map = new HashMap<>();
// 复制所有的节点
Node current = head;
while (current != null) {
map.put(current, new Node(current.val));
current = current.next;
}
// 复制next和random指针
current = head;
while (current != null) {
map.get(current).next = map.get(current.next);
map.get(current).random = map.get(current.random);
current = current.next;
}
return map.get(head);
}
解释
方法:
这个题解采用了三步走的策略:
1. 遍历原始链表,对于每个节点,在其后面创建一个新的节点,其值与原节点相同。
2. 再次遍历链表,这次设置新节点的random指针,使其指向原节点random指针所指向的节点的下一个节点(即复制的节点)。
3. 最后,将链表拆分为原链表和复制的链表,返回复制的链表的头节点。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在第二步中,将新节点的random指针设置为原节点的random指针所指向的节点的下一个节点时,如何确保原节点的random指针所指向的节点已经被复制并具有next指针?
▷🦆
在第三步拆分链表时,对于最后一个节点的处理有何特殊考虑,以确保原链表和复制链表都能正确结束?
▷🦆
如何处理原始链表中存在循环引用的情况,例如一个节点的random指针指向自己或形成较长的环状结构?
▷🦆
如果原链表为空(即head为None),题解中的函数似乎会返回None,这符合预期吗?如何验证这一行为是否正确?
▷