zoukankan      html  css  js  c++  java
  • leetcode 138. 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.

    和第133题差不多,都是图的复制,区别在于这道题的label有可能是相同的,所以导致了map的key有可能相同,所以需要处理。

    两种方法差不多。第二种更简洁。

    1、在复制next之后修改原结构的label为顺序增长,方便建立map,之后再修改回来。

    /**
     * Definition for singly-linked list with a random pointer.
     * class RandomListNode {
     *     int label;
     *     RandomListNode next, random;
     *     RandomListNode(int x) { this.label = x; }
     * };
     */
    public class Solution {
        public RandomListNode copyRandomList(RandomListNode head) {
            if( head == null )
                return null;
            Map map2 = new HashMap<Integer,RandomListNode>();
            int num = 1;
    
    
            RandomListNode node = head;
            RandomListNode newNode = new RandomListNode(head.label);
            RandomListNode node2 = newNode;
            map2.put(0,node2);
            node.label = 0;
    
            node = node.next;
            while( node != null ){
                RandomListNode nextNode = new RandomListNode(node.label);
                node2.next = nextNode;
                node2 = node2.next;
                node.label = num;
                map2.put(num,node2);
                num++;
                node = node.next;
    
            }
    
            node = head;
            node2 = newNode;
    
    
            while( node != null ){
    
                if( node.random == null){
                    node = node.next;
                    node2 = node2.next;
                    continue;
                }
    
                node2.random = (RandomListNode) map2.get( node.random.label );
    
                node = node.next;
                node2 = node2.next;
    
            }
            node2 = newNode;
            node = head;
            while( node != null ){
                node.label = node2.label;
                node = node.next;
                node2 = node2.next;
            }
    
    
            return newNode;
    
            
        }
    }

    2、建立map的时候使用

     Map<RandomListNode,RandomListNode>
    /**
     * Definition for singly-linked list with a random pointer.
     * class RandomListNode {
     *     int label;
     *     RandomListNode next, random;
     *     RandomListNode(int x) { this.label = x; }
     * };
     */
    public class Solution {
        public RandomListNode copyRandomList(RandomListNode head) {
            
            if( head == null )
                return null;
            Map<RandomListNode,RandomListNode> map = new HashMap<RandomListNode,RandomListNode>();
    
    
            RandomListNode node = head;
            while( node != null ){
                map.put(node,new RandomListNode(node.label));
                node = node.next;
            }
            node = head;
            while( node != null ){
                
                map.get(node).next = map.get(node.next);
                map.get(node).random = map.get(node.random);
                node = node.next;
    
            }
            return map.get(head);
            
        }
    }
  • 相关阅读:
    使用Maven Helper解决Maven依赖冲突
    bzoj 1037[ZJOI2008]生日聚会Party
    bzoj 1031[JSOI2007]字符加密
    bzoj 1029 [JSOI2007]建筑抢修
    bzoj 1025[SCOI2009]游戏
    bzoj 1027[JSOI2007]合金
    bzoj 1024[SCOI2009]生日快乐
    bzoj 1023[SHOI2008]cactus仙人掌图
    bzoj 1022 [SHOI2008]小约翰的游戏John
    bzoj 1021[SHOI2008]Debt 循环的债务
  • 原文地址:https://www.cnblogs.com/xiaoba1203/p/6065127.html
Copyright © 2011-2022 走看看