138. 随机链表的复制(中)

题目

  • 深拷贝一个链表,要求新链表中的每个节点都是新创建的,并且这些节点的 random 指针都指向新链表中的相应节点。

哈希表

  • 先使用Map建立映射,然后根据映射将random和next指针指向对应的节点或者null
var copyRandomList = function (head) {
  // 如果链表为空,直接返回null
  if (!head) return head;

  let cur = head; // 当前节点指针
  const map = new Map(); // 用于存储原节点与新节点的映射关系

  // 第一次遍历,生成一个具有val属性的新链表
  while (cur) {
    // 将原节点cur作为键,创建新节点并存入map
    map.set(cur, new Node(cur.val));
    cur = cur.next; // 移动到下一个节点
  }

  // 第二次遍历,根据map映射关系,将random和next指针指向对应的节点或者null
  cur = head; // 重新将cur指向链表的头节点
  while (cur) {
    // 设置新节点的next指针
    map.get(cur).next = map.get(cur.next) || null; // 如果cur.next存在,则指向新节点,否则指向null
    // 设置新节点的random指针
    map.get(cur).random = map.get(cur.random) || null; // 如果cur.random存在,则指向新节点,否则指向null
    cur = cur.next; // 移动到下一个节点
  }

  return map.get(head); // 返回深拷贝链表的头节点
};
posted @ 2025-01-06 10:48  Frommoon  阅读(17)  评论(0)    收藏  举报