您的位置:首页 > 运维架构

Copy List with Random Pointer

2014-08-02 10:39 344 查看


Copy List with Random Pointer

Total Accepted: 15399 Total
Submissions: 67259My Submissions

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.

Have you been asked this question in an interview?
Yes

Discuss

这个题目,其实挺简单的,要把原链表的每一个元素都拷贝一遍,不能拷贝多,也不能少拷贝。使用set和map可以,知道原来链表当中的节点是否访问过,没有就new一个节点,并以原链表节点为key,新链表节点为值存储起来,以后可能会用到。所以就以第一个节点为起始点,每次查询这个节点的random和next如果,这两个节点在拷贝链表当中没有对应的,那就new新的。有就直接取出来,然后对random和next建立相关连接信息。

/**
* 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) {
Map<RandomListNode,RandomListNode> set1 = new HashMap<RandomListNode,RandomListNode> ();
Map<RandomListNode,RandomListNode> set2 = new HashMap<RandomListNode,RandomListNode> ();
RandomListNode r1,r2,r3,r4,r5,r6;
if(head==null)
return null;
RandomListNode newHead = new RandomListNode(head.label);
r1 = newHead;
set1.put(head, head);
set2.put(head, newHead);
while(head!=null)
{
//make r1 to equals to head

if(!set1.containsKey(head))
{
set1.put(head, head);
r1 = new RandomListNode(head.label);
set2.put(head, r1);
}else
{
r1 = set2.get(head);
}
// make r3 equals to head next;
r2 = head.next;
if(r2!=null)
{
if(!set1.containsKey(r2))
{
set1.put(r2, r2);
r3 = new RandomListNode(r2.label);
set2.put(r2,r3);
}else{
// this place is set2
r3 = set2.get(r2);
}
}else
{
r3 = null;
}
// set t.next as r3
r1.next = r3;
//make r5 equals to head.random
r4 = head.random;
if(r4!=null)
{
if(!set1.containsKey(r4))
{
set1.put(r4, r4);
r5 = new RandomListNode(r4.label);
set2.put(r4, r5);
}else {
r5 = set2.get(r4);
}
}else
{
r5 = null;
}
r1.random = r5;
head = head.next;
}
return newHead;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: