• LeetcodeTop100 (30) 随机链表复制


    给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

    构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 

    例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

    返回复制链表的头节点。

    采用hashmap的方式,将新链表节点与旧链表一一映射,然后再根据就链表的映射关系来映射新链表

    1. package TOP21_30;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. //随机链表的复制
    5. //给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。
    6. //构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。
    7. //例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。
    8. //返回复制链表的头节点。
    9. public class Top30 {
    10. public class Node {
    11. public int val;
    12. public Node next;
    13. public Node random;
    14. public Node() {
    15. }
    16. public Node(int val, Node next, Node random) {
    17. this.val = val;
    18. this.next = next;
    19. this.random = random;
    20. }
    21. public Node(int val) {
    22. this.val = val;
    23. this.next = null;
    24. this.random = null;
    25. }
    26. }
    27. public Node copyRandomList(Node head) {
    28. if (head == null) {
    29. return null;
    30. }
    31. Map nodeMap = new HashMap<>();
    32. Node cur = head;
    33. // 构建原链表和新链表的映射
    34. while (cur!=null){
    35. nodeMap.put(cur,new Node(cur.val));
    36. cur = cur.next;
    37. }
    38. cur = head;
    39. // 构建新链表的映射关系
    40. while(cur!=null){
    41. nodeMap.get(cur).next = nodeMap.get(cur.next);
    42. nodeMap.get(cur).random = nodeMap.get(cur.random);
    43. cur = cur.next;
    44. }
    45. return nodeMap.get(head);
    46. }
    47. }

    harryptter / LeetcodeTop100 · GitCode

  • 相关阅读:
    支持 equals 相等的对象(可重复对象)作为 WeakHashMap 的 Key
    Java中的排序接口Comparable和比较器Comparator详解
    python为什么慢?(自用)
    计算机竞赛 基于深度学习的人脸专注度检测计算系统 - opencv python cnn
    低代码信创开发核心技术(四)动态元数据系统设计
    八、Thymeleaf链接表达式
    ubuntu开机系统出错且无法恢复。请联系系统管理员。
    白 - 权限提升和漏洞利用技巧
    路由策略简介
    基于vue的黑马前端项目小兔鲜
  • 原文地址:https://blog.csdn.net/harryptter/article/details/133360085