当前位置:   article > 正文

LeetCode-随机链表的复制

LeetCode-随机链表的复制

. - 力扣(LeetCode)

 本题思路:

首先注意到随机链表含有random的指针,这个random指针指向是随机的;先一个一个节点的拷贝,并且把拷贝的节点放在拷贝对象的后面,再让拷贝节点的next指向原链表拷贝对象的下一个节点,这样做的目的是实现拷贝节点的插入,即拷贝好的节点都放在原链表两个节点之间;

实现完拷贝节点的插入是为了实现拷贝节点random的指向;如果原链表拷贝对象的random指向为NULL,那么拷贝节点的random指向也置为NULL;若是拷贝对象的random指向不为NULL,那么就让拷贝节点的random指向拷贝对象的random的next,解释为什么要这样:假设现在要实现这个链表中一个拷贝节点的random指向,已知其他拷贝对象的next指向的就是拷贝节点;要实现random指向的这一个节点要找到和它拷贝对象一样的random指向,如何找到?只需要让这个拷贝节点的random指向它自己拷贝对象的random的next,这个被指向的拷贝节点就是原链表中这个要实现random指向的拷贝节点的拷贝对象的的random的next指向的拷贝节点;

最后再进行尾插操作,让拷贝节点形成一条新的链表;并且还原原链表;

  1. /**
  2. * Definition for a Node.
  3. * struct Node {
  4. * int val;
  5. * struct Node *next;
  6. * struct Node *random;
  7. * };
  8. */
  9. typedef struct Node Node;
  10. struct Node* copyRandomList(struct Node* head) {
  11. Node* cur=head;
  12. Node* next=NULL;
  13. Node* copy=NULL;
  14. while(cur)
  15. {
  16. next=cur->next;
  17. copy=(Node*)malloc(sizeof(Node));
  18. copy->next=next;
  19. copy->val=cur->val;
  20. cur->next=copy;
  21. cur=next;
  22. }//拷贝节点的插入
  23. cur=head;
  24. while(cur)
  25. {
  26. copy=cur->next;
  27. next=copy->next;
  28. if(cur->random==NULL)
  29. {
  30. copy->random=NULL;
  31. }
  32. else
  33. {
  34. copy->random=cur->random->next;
  35. }
  36. cur=next;
  37. }拷贝节点random的指向实现
  38. cur=head;
  39. Node* copyhead,*copytail;
  40. copyhead=copytail=(Node*)malloc(sizeof(Node));
  41. copyhead->val=-1;
  42. copyhead->next=copyhead->random=NULL;
  43. while(cur)
  44. {
  45. copy=cur->next;
  46. next=copy->next;
  47. copytail->next=copy;
  48. copytail=copytail->next;
  49. cur->next=next;
  50. cur=next;
  51. }//拷贝节点尾插变成新的要求的链表;还原成原链表
  52. Node* rsl=copyhead->next;
  53. free(copyhead);
  54. copyhead=NULL;
  55. return rsl;
  56. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/854810
推荐阅读
相关标签
  

闽ICP备14008679号