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代码:

  1. public RandomListNode copyRandomList(RandomListNode head) {
  2. RandomListNode newhead=null;
  3. RandomListNode newtail=null;
  4. Map<RandomListNode,RandomListNode> oldListMap = new HashMap<RandomListNode,RandomListNode>();
  5. if(head==null) return null;
  6. RandomListNode p=head;
  7. while(p!=null) {
  8. oldListMap.put(p,p.next);
  9. RandomListNode p1=p.next;
  10. if(newhead==null) {
  11. newhead=new RandomListNode(p.label);
  12. newtail=newhead;
  13. } else {
  14. RandomListNode tmp = new RandomListNode(p.label);
  15. newtail.next=tmp;
  16. newtail=tmp;
  17. }
  18. newtail.random = p;
  19. p.next=newtail;
  20. p=p1;
  21. }
  22. p=newhead;
  23. while(p!=null) {
  24. RandomListNode tmp = p.random;
  25. if(tmp.random==null) p.random=null;
  26. else {
  27. p.random=tmp.random.next;
  28. }
  29. p=p.next;
  30. }
  31. p=head;
  32. while(oldListMap.get(p)!=null) {
  33. p.next=oldListMap.get(p);
  34. p=p.next;
  35. }
  36. p.next=null;
  37. return newhead;
  38. }

C++代码:

  1. RandomListNode *copyRandomList(RandomListNode *head) {
  2. if(!head) return head;
  3. RandomListNode *p=head;
  4. RandomListNode *new_head=NULL;
  5. RandomListNode *tail=NULL;
  6. std::map<RandomListNode *,RandomListNode *> oldlistMap;
  7. while(p!=NULL) {
  8. RandomListNode *tmp=p;
  9. if(new_head==NULL) {
  10. new_head=new RandomListNode(p->label);
  11. tail=new_head;
  12. } else {
  13. RandomListNode *new_tmp = new RandomListNode(tmp->label);
  14. tail->next=new_tmp;
  15. tail=new_tmp;
  16. }
  17. oldlistMap[p]=p->next;
  18. p = p->next;
  19. tail->random=tmp;
  20. tmp->next=tail;
  21. }
  22. p=new_head;
  23. while(p!=NULL) {
  24. RandomListNode *tmp=p;
  25. RandomListNode *cur=p;
  26. RandomListNode *tmp_k = tmp->random;
  27. if(tmp_k!=NULL)
  28. cur->random=tmp_k->next;
  29. else cur->random=NULL;
  30. p=p->next;
  31. }
  32. p=head;
  33. while(p!=NULL) {
  34. RandomListNode *tmp=oldlistMap[p];
  35. p->next=tmp;
  36. p=tmp;
  37. }
  38. return new_head;
  39. }
posted @ 2014-07-28 21:03  purejade  阅读(115)  评论(0编辑  收藏  举报