zoukankan      html  css  js  c++  java
  • 复杂链表的复制(Hard)

    问题来源:选自LeetCode 138:复制带随机指针的链表

    问题描述:

    题目给定信息:

      该链表中每一个节点的成员变量都有两个,一个是next指针指向该节点的下一个节点,一个是random指针指向不确定,可以指向该链表中任意一个节点,也可以指向它自己,还可以指向为空,我们要克隆这个链表,并且保证每一个链表节点的两个指针都和原链表是一样的。

    问题分析:

      我们可以间接的利用节点地址和节点序号之间的映射关系,在Map集合中存贮两个链表(原链表和新建待克隆链表)的映射关系。通过一个while循环,创建出和每个链表节点值相同的节点,并且把这些节点都按照映射关系存进Map集合中,在这个循环中还能把新创建的节点的next指针赋上相应的值。然后再经过一个while循环,每遍历到原链表的一个节点,我们就在Map集合中找到该节点映射对应的新创建节点是哪一个,这样就能给新创建的节点的random指针进行赋值操作,便利循环结束,新创建的每一个节点的random指针也全部赋值结束。返回新创建的链表头指针就可以了。

    函数实现:

     方法一:

     1  public Node copyRandomList(Node head) {
     2         if (head == null) {
     3             return null;
     4         }
     5         Node newHead = new Node(head.val, null, null);
     6         Node temp = head.next;
     7         Node temp_New = newHead;
     8         Map<Node, Node> map = new HashMap<>();
     9         map.put(head, newHead);
    10         while (temp != null) {
    11             Node newList = new Node(temp.val, null, null);
    12             map.put(temp, newList);
    13             temp_New.next = newList;
    14             temp_New = newList;
    15             temp = temp.next;
    16         }
    17         temp = head;
    18         temp_New = newHead;
    19         while (temp != null) {
    20             temp_New.random = map.get(temp.random);
    21             temp = temp.next;
    22             temp_New = temp_New.next;
    23         }
    24         return newHead;
    25     }

    方法二:

     1 public Node copyRandomList(Node head) {
     2         Map<Node, Integer> map = new HashMap<Node, Integer>();
     3         Vector<Node> vector = new Vector<Node>();
     4         Node node = head;
     5         int i = 0;
     6         while (node != null) {
     7             vector.add(new Node(node.val, null, null));
     8             map.put(node, i);
     9             node = node.next;
    10             i++;
    11         }
    12         node=head;
    13         i=0;
    14         while(node!=null){
    15             vector.get(i).next=vector.get(i+1);
    16             if(node.random!=null){
    17                 int id=map.get(node);
    18                 vector.get(i).random=vector.get(id);
    19             }
    20             node=node.next;
    21             i++;
    22         }
    23         return vector.get(0);
    24     }

    运行结果:

  • 相关阅读:
    使用递归输出某个目录下所有子目录和文件
    如何进行复杂度分析?
    什么是时间复杂度?什么是空间复杂度?
    什么是复杂度?为什么要进行复杂度分析?
    什么是递归?递归的优缺点是什么?
    Executor 如何使用?
    什么是spring boot?为什么要用?
    spring boot核心配置文件是什么?
    @Autowired的作用是什么?
    @RequestMapping的作用是什么?
  • 原文地址:https://www.cnblogs.com/BaoZiY/p/10685166.html
Copyright © 2011-2022 走看看