LeetCode Copy List with Random Pointer

来源:互联网 发布:华裔女神陈曦 av淘宝 编辑:程序博客网 时间:2024/06/08 13:23

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.

思路分析:这题要求拷贝链表,包括内容,next指针和random指针。容易想到的思路是定义一个hashmap保存旧链表节点到新链表节点的映射关系,第一次遍历链表,只拷贝next指针和node,并且init hashmap, 第二遍遍历链表再拷贝所有节点的random指针,借助hashmap可以在O(1)时间内由给定旧链表节点找到新链表对应节点。时间复杂度和空间复杂度都是O(n)。

另有一个解法不需要额外空间,需要三遍遍历,要仔细画图分析,详细可见

http://codeganker.blogspot.com/2014/03/copy-list-with-random-pointer-leetcode.html

http://blog.csdn.net/fightforyourdream/article/details/16879561

AC Code

/** * 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) {        //0133        if(head == null) return null;        RandomListNode newHead = new RandomListNode(head.label);        HashMap<RandomListNode, RandomListNode> oldToNewMap = new HashMap<RandomListNode, RandomListNode>();        oldToNewMap.put(head, newHead);        RandomListNode newCur = newHead; // iter for newList        RandomListNode cur = head.next; // iter for oriList                while(cur != null){            RandomListNode newNode = new RandomListNode(cur.label);            newCur.next = newNode;            oldToNewMap.put(cur, newNode);            newCur = newNode;            cur = cur.next;        }                newCur = newHead;        cur = head;        while(cur != null){            newCur.random = oldToNewMap.get(cur.random);            cur = cur.next;            newCur = newCur.next;        }        return newHead;    }    //0202}


0 0
原创粉丝点击