leetcode138.随机链表的复制

打印 上一主题 下一主题

主题 1855|帖子 1855|积分 5575



  

随机链表的复制

问题分析

链表中的每个节点包罗三个属性:val(节点的值),next(指向下一个节点的指针),以及random(一个随机指针,可以指向链表中的任意节点,大概为NULL)。我们的目标是创建一个新的链表,其中每个节点的值与原链表中相应节点的值雷同,并且新链表中的next和random指针也正确地指向新链表中的节点。
算法分为三个主要步调:
1. 复制节点并插入到原节点后面:

◦ 遍历原链表,为每个节点创建一个副本,并将副本插入到原节点的后面。
◦ 这一步确保了每个原节点和其副本节点相邻,便于后续设置next和random指针。
2. 复制随机指针:

◦ 再次遍历链表,这次是为了复制每个副本节点的random指针。
◦ 由于副本节点紧跟在原节点之后,原节点的random指针指向的节点的下一个节点就是副本节点的random指针应该指向的节点。
3. 分离原链表和新链表:

◦ 遍历链表,将每个副本节点从原链表中分离出来,形成一个新的链表。
◦ 利用尾插法构建新链表,这样可以克制在构建新链表时破坏原链表的结构。
代码实现

代码实现遵循上述算法设计,具体步调如下:
1. 初始化指针和变量:

◦ 利用cur指针遍历原链表。
◦ 利用copyHead和copyTail指针来构建和维护新链表。
2. 复制节点:

◦ 为每个节点创建副本,并将其插入到原节点之后。
◦ 更新cur指针以继续遍历。
3. 复制随机指针:

◦ 再次遍历链表,为每个副本节点设置random指针。
◦ 更新cur指针以继续遍历。
4. 分离链表:

◦ 遍历链表,将副本节点从原链表中分离出来,并构建新链表。
◦ 利用尾插法将副本节点添加到新链表中。
5. 返回新链表的头节点:

◦ 返回copyHead,即新链表的头节点
  1. class
  2. Solution {
  3. public
  4. :
  5.     Node* copyRandomList(Node* head) {
  6.         // 1.拷贝链表,并插入到原节点的后面
  7.         Node* cur = head;
  8.         while(cur)
  9.         {
  10.             Node* next = cur->next;
  11.             Node* copy = (Node*)malloc(sizeof(Node));
  12.             copy->val = cur->val;
  13.             // 插入
  14.             cur->next = copy;
  15.             copy->next = next;
  16.             // 迭代往下走
  17.             cur = next;
  18.         }
  19.         // 2.置拷贝节点的random
  20.         cur = head;
  21.         while(cur)
  22.         {
  23.             Node* copy = cur->next;
  24.             if(cur->random != NULL)
  25.                 copy->random = cur->random->next;
  26.             else
  27.                 copy->random = NULL;
  28.             cur = copy->next;        }
  29.         // 3.解拷贝节点,链接拷贝节点
  30.         Node* copyHead = NULL, *copyTail = NULL;
  31.                 cur = head;
  32.         while(cur)
  33.         {
  34.             Node* copy = cur->next;
  35.             Node* next = copy->next;
  36.             // copy解下来尾插
  37.             if(copyTail == NULL)
  38.             {
  39.                 copyHead = copyTail = copy;
  40.             }
  41.             else
  42.             {   
  43.                 copyTail->next = copy;
  44.                 copyTail = copy;
  45.             }
  46.             cur->next = next;
  47.             cur = next;
  48.         }
  49.         return copyHead;
  50.     }
  51. };
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表