题目
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指针外还有一个随机指针。
方法1:可以通过三步实现拷贝,a.在原链表插入拷贝节点,b.复制随机指针,c.分解成两个独立的链表
方法2:使用Hash表的做法,先依次遍历原链表,每经过一个节点X,开辟一个新节点Y,然后(key=X的地址,value=Y的地址)存入哈希表。第二次再遍历原链表,根据拓扑结构设置新的链表。需要O(n)的空间,时间也是O(n)。
/**
* 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;
}
RandomListNode p=head;
//copy every node and insert to list
while(p!=null){
RandomListNode copy=new RandomListNode(p.label);
copy.next=p.next;
p.next=copy;
p=copy.next;
}
//copy random pointer for each new node
p=head;
while(p!=null){
if(p.random!=null){
p.next.random=p.random.next;
}
p=p.next.next;
}
//break list to two
//只要断开连接的next指针即可,random不变
p=head;
RandomListNode newHead=head.next;
while(p!=null){
RandomListNode temp=p.next;
p.next=temp.next;
if(temp.next!=null){
temp.next=temp.next.next;
}
p=p.next;
}
return newHead;
}
}
//方法2,利用HashMap
public RandomListNode copyRandomList(RandomListNode head){
if(head==null){
return null;
}
HashMap<RandomListNode,RandomListNode> map=new HashMap<RandomListNode,RandomListNode>();
RandomListNode newHead=new RandomListNode(head.label);
RandomListNode p=head;
RandomListNode q=newHead;
map.put(head,newHead);
p=p.next;
while(p!=null){
RandomListNode temp=new RandomListNode(p.label);
map.put(p,temp);
q.next=temp;
q=temp;
p=p.next;
}
p=head;
q=newHead;
while(p!=null){
if(p.random!=null){
q.random=map.get(p.random);
}else{
q.random=null;
}
p=p.next;
q=q.next;
}
return newHead;
}
---EOF---