复制带随机指针的链表

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

要求返回这个链表的深拷贝。

示例:

输入:
{"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}

解释:
节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。

解法1:

/**
   * 创建一个存放节点的复制节点的map
   */
  static Map<Node, Node> visitedMap = new HashMap<>(8);

  public static Node copyRandomList(Node head) {
    /*当头节点为null时返回null*/
    if (head == null) {
      return null;
    }
    /*先看复制节点存不存在,如果存在直接返回*/
    Node value = visitedMap.get(head);
    if (value != null) {
      return value;
    }
    /*创建一个复制节点*/
    Node node = new Node(head.val, null, null);
    /*将复制节点放入map中*/
    visitedMap.put(head, node);
    /*复制节点的下一个节点就是head的下个节点*/
    node.next = copyRandomList(head.next);
    /*复制节点的随机节点就是head的随机节点*/
    node.random = copyRandomList(head.random);

    return node;
  }

解法2:

public static Node copyRandomList1(Node head) {
    /*当头节点为null时返回null*/
    if (head == null) {
      return null;
    }
    /*定义一个头节点的引用*/
    Node pre = head;
    /*循环里操作是把copy节点放在当前节点后面*/
    while (pre != null) {
      /*copy当前节点*/
      Node copy = new Node(pre.val, null, null);
      /*copy的节点的下一个节点是当前节点的下一个*/
      copy.next = pre.next;
      /*当前节点的下一个是copy节点*/
      pre.next = copy;
      /*由于当前节点的下一个节点是自己copy节点,所以当前节点要找自己的下下一个继续循环*/
      pre = pre.next.next;
    }
    /*头节点引用再次指向头节点*/
    pre = head;
    /*这步循环操作是把当前节点后面的copy节点的random赋值为与当前节点同步的copy节点*/
    while (pre != null) {
      pre.next.random = pre.random != null ? pre.random.next : null;
      pre = pre.next.next;
    }
    /*头节点引用再次指向头节点*/
    pre = head;
    /*定义一个copy头节点引用*/
    Node h = pre.next;
    /*这步循环操作是把当前节点后面的copy节点的next赋值为与当前节点同步的copy节点,并与copy节点分离成2个不同的链*/
    while (pre != null) {
      Node c = pre.next;
      if (c != null) {
        Node b = pre.next.next;
        pre.next = b;
        if (b != null) {
          c.next = b.next;
        }
        pre = b;
      }
    }
    return h;
  }

原文地址:https://www.cnblogs.com/wuyouwei/p/11795809.html

时间: 2024-11-10 01:57:55

复制带随机指针的链表的相关文章

LintCode(105) 复制带随机指针的链表

题目 复制带随机指针的链表 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点. 返回一个深拷贝的链表. 分析 一个经典题目,思想就是在复制每个原节点链接其后,然后依次添加新节点的random指针. 遍历复制后的链表,删除原节点. 就不详述了,看代码,重点是练习Python实现~~~ Python代码 # Definition for singly-linked list with a random pointer. # class RandomListNode:

LintCode复制带随机指针的链表

中等 复制带随机指针的链表 查看运行结果 27% 通过 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点. 返回一个深拷贝的链表. 用了一个哈希表,空间换取时间 /** * Definition for singly-linked list with a random pointer. * struct RandomListNode { * int label; * RandomListNode *next, *random; * RandomListNode(

复制带随机指针的链表 &#183; Copy List with Random Pointer

[抄题]: 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点. 返回一个深拷贝的链表. [思维问题]: [一句话思路]: [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图]: [一刷]: [总结]: [复杂度]:Time complexity: O() Space complexity: O() [英文数据结构,为什么不用别的数据结构]: [其他解法]: [Follow Up]: [题目变变变]: 原文地址

[LeetCode]138复制带随机指针的链表

题目描述: 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深度拷贝. 思路: 先遍历链表,将每个节点对应的随机指针指向的对象利用HashMap存起来,key的值就为节点的在链表里面的位置,Value的值是随机指针指向的对象 再把原链表的节点对应的在链表中的位置存起来,key为节点对象,然后将节点的label取出来新建节点,存起来 再次遍历链表,处理随机指针 这是第一种用HashMap的办法,但是性能不行,还有优化的空间,之后我再研究

leetcode138. 复制带随机指针的链表

题目的意思比较难理解,分为3步.第一步建立二重链表,第二步random指针的建立,第三步拆分二重链表. /* // Definition for a Node. class Node { public: int val; Node* next; Node* random; Node(int _val) { val = _val; next = NULL; random = NULL; } }; */ class Solution { public: Node* copyRandomList(No

leetcode 138. 复制带随机指针的链表

C++采用哈希表,时间复杂度O(n),空间复杂度O(n)空间复杂度应该可以降低: /* // Definition for a Node. class Node { public: int val; Node* next; Node* random; Node() {} Node(int _val, Node* _next, Node* _random) { val = _val; next = _next; random = _random; } }; */ class Solution {

九章算法面试题57 拷贝带随机指针的链表结构

九章算法官网-原文网址 http://www.jiuzhang.com/problem/57/ 题目 给出一条带随机指针的链表,对其进行深度拷贝(Deep Copy). 带随机指针的意思是,对于每个节点,除了next指针指向下一个节点以外,还带一个randomNext指针指向任何一个链表中的节点或空. 深度拷贝的意思是,对于新复制出来的链表,是一条完全独立于原来链表的链表,对于这个新的链表进行任何操作都不会对原来的链表产生影响. Follow Up Question: 如果不能使用额外的辅助空间

LeetCode138 Copy List with Random Pointer(深度复制带有随机指针的链表) Java题解

题目: A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null. Return a deep copy of the list. 解题: 这题是要复制一个链表,这个链表比普通的链表多一个指针,这个指针可以指向任意地方,可以为空也可以为链表中的任一个节点,今天中午的时候我同学和我说起这题,当时问

[LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null. Return a deep copy of the list. 这道链表的深度拷贝题的难点就在于如何处理随机指针的问题,由于每一个节点都有一个随机指针,这个指针可以为空,也可以指向链表的任意一个节点,如果我们在每生成一个新节点给其随机指