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

问:

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;
}
相关推荐
hetao1733837几秒前
校内场-提高组 ZYZSC-S-Round 4
c++·算法
彧azz28 分钟前
二叉搜索树学习记录
c语言·数据结构·笔记·算法
手写码匠1 小时前
DeepSeek 函数调用实战:从零搭建一个会“动手“的 AI 助手
人工智能·深度学习·算法·aigc
果壳science2 小时前
《自然本源》如何实现狭义相对论的代数化
笔记·算法·几何学
suhan2 小时前
【数据结构】二、线性表:2.单链表的定义与实现(带头结点与不带头结点的区别)
数据结构
302wanger3 小时前
分享一个工作习惯:整点看即时消息
算法
洋不写bug4 小时前
排序(一)基础排序,插入|希尔|冒泡|直接选择排序详解
java·算法·排序算法·插入排序·冒泡排序·希尔排序·直接选择排序
牧羊人.3334 小时前
动手学深度学习 03 | 卷积神经网络实现手写数字识别
人工智能·深度学习·神经网络·算法·cnn
AgentMaster5 小时前
数据治理工具选型指南:一套可复用的四阶段决策框架
大数据·数据结构·人工智能·算法
liliangcsdn5 小时前
最终留出样本/样本外测试集-holdout解读
算法