• leetcode:138. 随机链表的复制


    一、题目:

    138. 随机链表的复制 - 力扣(LeetCode)

     

    函数原型:

    struct Node* copyRandomList(struct Node* head)

    二、思路

    本题是给出一个单链表,单链表的每个结点还额外有一个随机指针,随机指向其他结点,要求复制该链表。

    常规情况下复制链表,只需要遍历原链表,新建和原链表相同的结点尾插到新链表即可。

    但是该链表有一个随机指针,还需要找到原链表中各个结点随机指针的指向,让新链表中结点的随机指针也指向新链表中的与原链表中相同位置的结点。因此还要在新链表中找到原链表中各个结点随机指针指向的结点,算法为O(N^2),且判断是否为随机指针指向的结点只能通过结点值判断,如果链表中有多个值相同的结点,九不便于判断是否为随机指针指向的结点。

     

    上述方法不易实现,此处提供一个全新的思路:

    由于新建一个链表每个结点的随机指针不好复制,那么就在原链表上复制每个结点,然后再复制每个结点的随机指针。

    先在原链表每个结点后复制一个相同的结点,复制完成后,再次遍历链表,就可以通过当前结点随机指针指向结点的下一个结点找到复制结点随机指针需要指向的结点。最后将每个复制的结点从原链表中拆下来,重新链接组成新的链表即可完成链表的复制。

    三、代码

    1. /**
    2. * Definition for a Node.
    3. * struct Node {
    4. * int val;
    5. * struct Node *next;
    6. * struct Node *random;
    7. * };
    8. */
    9. struct Node* copyRandomList(struct Node* head) {
    10. struct Node*cur=head;
    11. while(cur)//在原链表每个结点后复制一个相同的结点
    12. {
    13. struct Node* copy=(struct Node*)malloc(sizeof(struct Node));
    14. copy->val=cur->val;
    15. copy->next=cur->next;
    16. cur->next=copy;
    17. cur=cur->next->next;
    18. }
    19. cur=head;
    20. while(cur)
    21. {
    22. //复制结点的随机指针指向的结点就是当前结点随机指针指向结点的下一结点
    23. if(cur->random)
    24. cur->next->random=cur->random->next;
    25. else
    26. cur->next->random=NULL;
    27. cur=cur->next->next;
    28. }
    29. cur=head;
    30. struct Node* newhead=NULL;
    31. struct Node *tail=NULL;
    32. while(cur)//拆下复制的结点并恢复原链表,重新链接这些结点
    33. {
    34. struct Node* next=cur->next;
    35. cur->next=next->next;
    36. if(tail==NULL)
    37. {
    38. newhead=tail=next;
    39. }
    40. else
    41. {
    42. tail->next=next;
    43. tail=next;
    44. }
    45. cur=cur->next;
    46. }
    47. return newhead;
    48. }

  • 相关阅读:
    网络版本计算器(再谈“协议“)
    python 打包可执行文件-pyinstaller详解
    学习JAVA的第十三天(基础)
    MQ 消息丢失、重复、积压问题,如何解决?
    网络地址转换(NAT)(二)
    完成ECshop的开源系统的详细过程
    C# 在PDF中添加墨迹注释Ink Annotation
    mongodb基础整理篇————副本概念篇[外篇]
    大数据毕设题目推荐 - 最新大数据毕设选题 - 毕业设计项目方向课题
    计算机组成与结构
  • 原文地址:https://blog.csdn.net/2301_76197086/article/details/134410082