zoukankan      html  css  js  c++  java
  • Copy List with Random Pointer

    没懂题目的用意,看了网上求解。主要问题在于复制时我们一般是一个节点一个节点复制的,但对于随机节点有可能复制时,那个节点还没创建!!所以应如何对乱序的指向进行复制??

    暴力解决是,先创建好所有节点,然后都每个节点的随机指向都循环一次链表,直到找到乱序指向的那个节点,进行复制连接!!!时间复杂度很高!!

    比较经典的做法是第一次循环在每个节点后插入一个复制的节点,第二次循环时可以将对应的 乱序指向 进行复制连接到新创建节点(肯定就在原节点后的一个节点),第三遍循环就可以隔点将新节点依次串起来!

     1 /**
     2  * Definition for singly-linked list with a random pointer.
     3  * struct RandomListNode {
     4  *     int label;
     5  *     RandomListNode *next, *random;
     6  *     RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     RandomListNode *copyRandomList(RandomListNode *head) {
    12        if(head==NULL) return head;
    13         RandomListNode *p;
    14         p=head;
    15         while(p)
    16         {
    17             RandomListNode *copy=new RandomListNode(p->label);
    18             copy->next=p->next;
    19             p->next=copy;
    20             
    21             p=p->next->next;
    22         }
    23         p=head;
    24         while(p)
    25         {
    26             if(p->random==NULL)p->next->random=NULL;
    27             else p->next->random=p->random->next;
    28             p=p->next->next;
    29         }
    30         RandomListNode node(0);
    31         //node.next=head->next;
    32         p=&node;
    33         while(head)
    34         {
    35             p->next=head->next;
    36             head->next=head->next->next;
    37             head=head->next;
    38             p=p->next;
    39             
    40         }
    41         return node.next;
    42     }
    43 };
  • 相关阅读:
    21.09.12模拟 P2809 hzwer 爱折纸
    21.09.13模拟 保存名画
    21.09.13模拟赛 魔法传输
    21.09.13模拟 分割金币
    21.09.13模拟 友谊值
    21.09.10模拟 朗格拉日计数
    21.09.10模拟 雷神领域
    P4551 最长异或路径
    P2894 [USACO08FEB]Hotel G
    NOIP复习(总结套路)
  • 原文地址:https://www.cnblogs.com/daocaorenblog/p/4893047.html
Copyright © 2011-2022 走看看