• 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);
            
        }
    }
  • 相关阅读:
    ZOJ 3332 Strange Country II
    ZOJ 3331 Process the Tasks(双塔DP)
    ZOJ 3326 An Awful Problem(模拟)
    HDU 1796 How many integers can you find(容斥原理)
    HDU 4059 The Boss on Mars(容斥原理)
    HDU 4135 Co-prime(容斥原理)
    HDU 5677 ztr loves substring(回文串加多重背包)
    CodeForces 668B Little Artem and Dance
    CodeForces 667A Pouring Rain
    Java实现 LeetCode 764 最大加号标志(暴力递推)
  • 原文地址:https://www.cnblogs.com/xiaoba1203/p/6065127.html
Copyright © 2020-2023  润新知