码迷,mamicode.com
首页 > 编程语言 > 详细

leetcode 138. Copy List with Random Pointer ----- java

时间:2016-11-15 14:24:27      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:next   方法   get   integer   class   bsp   dom   this   key   

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);
        
    }
}

 

leetcode 138. Copy List with Random Pointer ----- java

标签:next   方法   get   integer   class   bsp   dom   this   key   

原文地址:http://www.cnblogs.com/xiaoba1203/p/6065127.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!