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

问:

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;
}
相关推荐
课堂剪切板1 小时前
ch03 部分题目思路
算法
山登绝顶我为峰 3(^v^)32 小时前
如何录制带备注的演示文稿(LaTex Beamer + Pympress)
c++·线性代数·算法·计算机·密码学·音视频·latex
Two_brushes.4 小时前
【算法】宽度优先遍历BFS
算法·leetcode·哈希算法·宽度优先
森焱森6 小时前
水下航行器外形分类详解
c语言·单片机·算法·架构·无人机
QuantumStack7 小时前
【C++ 真题】P1104 生日
开发语言·c++·算法
写个博客8 小时前
暑假算法日记第一天
算法
绿皮的猪猪侠8 小时前
算法笔记上机训练实战指南刷题
笔记·算法·pta·上机·浙大
hie988949 小时前
MATLAB锂离子电池伪二维(P2D)模型实现
人工智能·算法·matlab
杰克尼9 小时前
BM5 合并k个已排序的链表
数据结构·算法·链表
.30-06Springfield10 小时前
决策树(Decision tree)算法详解(ID3、C4.5、CART)
人工智能·python·算法·决策树·机器学习