返回轨道
算法 · 2026-05-14 · 20 阅读

P102 含随机指针的链表拷贝

算法 20 阅读

信号摘要

难度:Medium · 时长:08:24 · leetcode 138 · lintcode 105

P102 含随机指针的链表拷贝

未对外公开播放权限
点击查看说明

描述

这个题目说的是,给你一个单链表,链表上每个节点都包含一个随机指针,随机指针可能为空,也可能指向这条链表上任意节点。你要写一个函数,对这条链表进行深拷贝。

代码

public class AlgoCasts {

  class RandomListNode {
    int val;
    RandomListNode next, random;

    RandomListNode(int x) {
      this.val = x;
    }
  }

  // Time: O(n), Space: O(n)
  public RandomListNode copyListWithRandomPointer(RandomListNode head) {
    if (head == null) return null;
    Map<RandomListNode, RandomListNode> map = new HashMap<>();
    RandomListNode copyHead = new RandomListNode(head.val);
    map.put(head, copyHead);
    for (RandomListNode p = head.next, q = copyHead; p != null; p = p.next, q = q.next) {
      q.next = new RandomListNode(p.val);
      map.put(p, q.next);
    }
    for (RandomListNode p = head, q = copyHead; p != null; p = p.next, q = q.next) {
      if (p.random != null) {
        q.random = map.get(p.random);
      }
    }
    return copyHead;
  }

  // Time: O(n), Space: O(1)
  public RandomListNode copyListWithRandomPointerO1(RandomListNode head) {
    if (head == null) return null;
    for (RandomListNode p = head; p != null; p = p.next.next) {
      RandomListNode copy = new RandomListNode(p.val);
      copy.next = p.next;
      p.next = copy;
    }
    for (RandomListNode p = head; p != null; p = p.next.next) {
      if (p.random != null)
        p.next.random = p.random.next;
    }
    RandomListNode dummy = new RandomListNode(0);
    RandomListNode p = head, cp = dummy;
    while (p != null) {
      RandomListNode copy = p.next, next = p.next.next;
      cp.next = copy;
      cp = copy;
      p.next = next;
      p = next;
    }
    return dummy.next;
  }

}

📡 通讯频道