• leetcode做题笔记138. 复制带随机指针的链表


    给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

    构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。

    例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

    返回复制链表的头节点。

    用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

    val:一个表示 Node.val 的整数。

    random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

    你的代码 只 接受原链表的头节点 head 作为传入参数。

    思路一:回溯

    c语言解法

    1. struct Node* copyRandomList(struct Node* head) {
    2. struct Node* cur=head;
    3. while(cur)
    4. {
    5. struct Node* next=cur->next;
    6. struct Node* copy=(struct Node*)malloc(sizeof(struct Node));
    7. copy->val=cur->val;
    8. cur->next=copy;
    9. copy->next=next;
    10. cur=next;
    11. }
    12. cur=head;
    13. while(cur)
    14. {
    15. struct Node* copy=cur->next;
    16. if(cur->random==NULL)
    17. {
    18. copy->random=NULL;
    19. }
    20. else
    21. {
    22. copy->random=cur->random->next;
    23. }
    24. cur=copy->next;
    25. }
    26. cur=head;
    27. struct Node* copyhead=NULL,*copytail=NULL;
    28. while(cur)
    29. {
    30. struct Node* copy=cur->next;
    31. struct Node* next=copy->next;
    32. if(copytail==NULL)
    33. {
    34. copytail=copyhead=copy;
    35. }
    36. else
    37. {
    38. copytail->next=copy;
    39. copytail=copytail->next;
    40. }
    41. cur->next=next;
    42. cur=next;
    43. }
    44. return copyhead;
    45. }

    分析:

    本题要对一个特殊的链表进行复制,这个链表每个节点包含一个额外增加的随机指针 random,可以先将该链表每个节点记录下来,当记录的节点的指针指向空节点时原复制的节点也指向空,最后将操作完的链表用copytail连接起来,最后输出copyhead

    总结:

    本题考察对链表的操作,要将链表深拷贝即将链表复制下来再根据具体情况添加最后连接后返回

  • 相关阅读:
    VMware虚拟机安装运行MacOS系统
    jmeter单接口和多接口测试
    求告知识图谱构建工具
    牛客多校-Z-Game on grid-(博弈论+必胜态必败态转移)
    antd react 文件上传只允许上传一个文件且上传后隐藏上传按钮
    杰理之可能出现有些芯片音乐播放速度快【篇】
    python实现从excel导出csv最完整版本,openpyxl,pandas,xlrd全家桶
    记录因Sharding Jdbc批量操作引发的一次fullGC
    项目经理--要具备的能力
    [ C++ ] C++之模板template
  • 原文地址:https://blog.csdn.net/si_mple_/article/details/132889652