leetcode138-随机链表的复制
leetcode 138
思路
利用哈希表解答
使用哈希表
来建立原节点和复制节点之间的映射关系,具体思路如下:
- 第一次遍历原链表:为每个原节点创建一个对应的复制节点,并将原节点和复制节点的映射存入哈希表中。同时,将复制节点连接成一个新链表
- 第二次遍历原链表:通过哈希表查找每个原节点的random指针所指向的节点,并为对应的复制节点设置random指针
关键步骤
创建复制节点并建立映射
- 遍历原链表,为每个节点创建值相同的新节点
- 使用Map存储原节点到新节点的映射关系
- 将新节点依次连接成一个新链表
设置随机指针
- 再次遍历原链表,对于每个节点的random指针
- 通过哈希表查找对应的复制节点,并设置新链表中对应节点的random指针
时间复杂度:O(n) 空间复杂度: O(n)
实现
var copyRandomList = function (head) {let cur = head;let dummy = new Nodelist();let copyCur = dummy;const map = new Map();while (cur) {const val = cur.val;copyCur.next = new Nodelist(val);map.set(cur, copyCur.next);cur = cur.next;copyCur = copyCur.next;}cur = head, copyCur = dummy.next;while (cur) {copyCur.random = map.get(cur.random) || null;cur = cur.next;copyCur = copyCur.next;}return dummy.next;
};class Nodelist {constructor(val) {this.val = val;this.next = null;this.random = null;}
}