LC138. Copy List with Random Pointer

来源:互联网 发布:2016中国对外投资数据 编辑:程序博客网 时间:2024/06/18 02:29

实现中遇到的问题:
1.StackOverflowError
代码如下

class RandomListNode {              int label;              RandomListNode next, random;              RandomListNode(int x) { this.label = x; }    };    public RandomListNode copyRandomList(RandomListNode head) {        if(head==null) return null;        HashMap<Integer,RandomListNode> map = new HashMap<Integer,RandomListNode>();        searchNodes(map,head);        return map.get(head.label);    }    public RandomListNode searchNodes(HashMap<Integer,RandomListNode> map, RandomListNode oldNode){        if(map.containsKey(oldNode.label)) return map.get(oldNode.label);        else{            RandomListNode newNode = new RandomListNode(oldNode.label);            map.put(newNode.label, newNode);            if(oldNode.next!=null) newNode.next = searchNodes(map,oldNode.next);            if(oldNode.random!=null) newNode.random = searchNodes(map,oldNode.random);            return newNode;        }    }

问题原因:遇到大量数据的时候递归次数过多,导致栈溢出

修改后算法:

public RandomListNode copyRandomList(RandomListNode head) {        if(head==null) return null;        HashMap<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);    }
0 0
原创粉丝点击