【算法】复制含有随机指针节点的链表

问:

rand指针是单链表节点结构中新增的指针,rand可能指向链表中的任意一个节点,也可能指向null。给定一个由Node节点类型组成的无环单链表的头节点head,请实现一个函数完成这个链表的复制,并返回复制的新链表的头节点

答:

(1) 使用额外空间

初始化一个哈希表,key为Node类型,存储老节点,value也为Node类型,存储克隆的新节点。遍历每一个老节点,生成对应的克隆节点,并把这两个节点的内存地址放入到map中去。然后设置新链表的next方向和random方向的指针,遍历老链表,通过map查出它的新链表,设置上next指针,random指针同理

java 复制代码
//使用额外空间哈希表
public static Node copyListWithRand1(Node head) {
  HashMap<Node, Node> map = new HashMap<Node, Node>();
  Node cur = head;
  while (cur != null) {
    map.put(cur, new Node(cur.value));
    cur = cur.next;
  }
  cur = head;
  while (cur != null) {
    map.get(cur).next = map.get(cur.next);
    map.get(cur).rand = map.get(cur.rand);
    cur = cur.next;
  }
  return map.get(head);
}

(2) 不使用额外空间

首先生成克隆节点,把克隆节点就放在当前老链表节点的下一个,然后把原来老链表的下一个节点放在克隆节点的后面,接着一对一对的拿出老节点和新节点进行处理

java 复制代码
public static Node copyListWithRand2(Node head) {
  if (head == null) {
    return null;
  }
  Node cur = head;
  Node next = null;
  while (cur != null) {
    next = cur.next;
    cur.next = new Node(cur.value);
    cur.next.next = next;
    cur = next;
  }
  cur = head;
  Node curCopy = null;
  while (cur != null) {
    next = cur.next.next;
    curCopy = cur.next;
    curCopy.rand = cur.rand != null ? cur.rand.next : null;
    cur = next;
  }
  return res;
}
相关推荐
ZhengEnCi7 小时前
GPT-6 Astra 爆改 Qwen 权重真有那么神吗:权重空间编程 0.016% 参数的真相
算法·架构
罗西的思考7 小时前
【轻量化复刻大模型 / KIMI K3】KDA(Kimi Delta Attention):并行
人工智能·算法·机器学习
夜不会漫长9 小时前
C++:红黑树
数据结构·算法
AI备案指南-满满10 小时前
算法备案审核不通过,一般是什么原因?
java·人工智能·算法·大模型备案·算法备案·大模型登记
Ramble_Naylor10 小时前
Rust深度解读:Send 与 Sync 的本质与线程安全边界
python·算法·rust
秋天的怀念_David10 小时前
算法一千零一夜 · 第二十三夜 电力民生写成的曲线
java·程序人生·算法
不一样的故事12610 小时前
NB/T 47013.8-2015 附录D 吸枪技术
人工智能·经验分享·算法
通问AI10 小时前
用 200 行 Python 给文档库做「上下文完整度」自检:四个可复算的检查项
算法
揽星河..10 小时前
【C语言】扫雷游戏
c语言·算法·游戏
丘山录10 小时前
本地部署 LongCat-2.5,要 7 台机器我只有 4 台
人工智能·算法