Copy List with Random Pointer
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.
思想:先处理线性指针,随后处理随机指针,最后恢复原链表(用HashMap保存)
java代码:
- public RandomListNode copyRandomList(RandomListNode head) {
- RandomListNode newhead=null;
- RandomListNode newtail=null;
- Map<RandomListNode,RandomListNode> oldListMap = new HashMap<RandomListNode,RandomListNode>();
- if(head==null) return null;
- RandomListNode p=head;
- while(p!=null) {
- oldListMap.put(p,p.next);
- RandomListNode p1=p.next;
- if(newhead==null) {
- newhead=new RandomListNode(p.label);
- newtail=newhead;
- } else {
- RandomListNode tmp = new RandomListNode(p.label);
- newtail.next=tmp;
- newtail=tmp;
- }
- newtail.random = p;
- p.next=newtail;
- p=p1;
- }
- p=newhead;
- while(p!=null) {
- RandomListNode tmp = p.random;
- if(tmp.random==null) p.random=null;
- else {
- p.random=tmp.random.next;
- }
- p=p.next;
- }
- p=head;
- while(oldListMap.get(p)!=null) {
- p.next=oldListMap.get(p);
- p=p.next;
- }
- p.next=null;
- return newhead;
- }
C++代码:
- RandomListNode *copyRandomList(RandomListNode *head) {
- if(!head) return head;
- RandomListNode *p=head;
- RandomListNode *new_head=NULL;
- RandomListNode *tail=NULL;
- std::map<RandomListNode *,RandomListNode *> oldlistMap;
- while(p!=NULL) {
- RandomListNode *tmp=p;
- if(new_head==NULL) {
- new_head=new RandomListNode(p->label);
- tail=new_head;
- } else {
- RandomListNode *new_tmp = new RandomListNode(tmp->label);
- tail->next=new_tmp;
- tail=new_tmp;
- }
- oldlistMap[p]=p->next;
- p = p->next;
- tail->random=tmp;
- tmp->next=tail;
- }
- p=new_head;
- while(p!=NULL) {
- RandomListNode *tmp=p;
- RandomListNode *cur=p;
- RandomListNode *tmp_k = tmp->random;
- if(tmp_k!=NULL)
- cur->random=tmp_k->next;
- else cur->random=NULL;
- p=p->next;
- }
- p=head;
- while(p!=NULL) {
- RandomListNode *tmp=oldlistMap[p];
- p->next=tmp;
- p=tmp;
- }
- return new_head;
- }