zoukankan      html  css  js  c++  java
  • leetcode

    A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

    Return a deep copy of the list.

    个人思路:

    1,先遍历一遍链表,创建出复制链表,并且复制链表的next指针已经连接好,同时用一个map存储原结点和新结点的映射关系

    2,同时遍历一遍原链表和复制链表,此时关注random指针,根据原结点random指针指向的结点和map表,便可找到对应的复制结点,使复制的random指针指向该复制结点即可

    代码:

     1 #include <stddef.h>
     2 #include <map>
     3 
     4 using namespace std;
     5 
     6 struct RandomListNode
     7 {
     8     int label;
     9     RandomListNode *next, *random;
    10     RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
    11 };
    12 
    13 class Solution {
    14 public:
    15     RandomListNode *copyRandomList(RandomListNode *head) {
    16         if (!head)
    17         {
    18             return NULL;
    19         }
    20 
    21         map<RandomListNode*, RandomListNode*> original2copy;        
    22         RandomListNode *originalCurrent = head->next;
    23         RandomListNode *copyHead = new RandomListNode(head->label);
    24         RandomListNode *copyCurrent = copyHead;
    25 
    26         original2copy[head] = copyHead;
    27 
    28         while (originalCurrent) //先创建copy结点和连接next指针,并记录配对信息
    29         {
    30             copyCurrent->next = new RandomListNode(originalCurrent->label);
    31             copyCurrent = copyCurrent->next;
    32             original2copy[originalCurrent] = copyCurrent;
    33             originalCurrent = originalCurrent->next;
    34         }
    35 
    36         originalCurrent = head;
    37         copyCurrent = copyHead;
    38         while (originalCurrent) //连接random指针
    39         {
    40             if (originalCurrent->random)
    41             {
    42                 copyCurrent->random = original2copy[originalCurrent->random];
    43             }
    44 
    45             originalCurrent = originalCurrent->next;
    46             copyCurrent = copyCurrent->next;
    47         }
    48 
    49         return copyHead;
    50     }
    51 };
    View Code

    还有一个更加巧妙的思路,将复制结点放在原结点之后,这样一来,复制结点的random指针指向的结点便是原结点random指针指向结点的next结点,最后将原链表和复制链表拆开即可,这个思路比上面那个省去了O(n)的空间消耗

    代码:

     1 #include <stddef.h>
     2 
     3 struct RandomListNode
     4 {
     5     int label;
     6     RandomListNode *next, *random;
     7     RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
     8 };
     9 
    10 class Solution {
    11 public:
    12     RandomListNode *copyRandomList(RandomListNode *head) {
    13         if (!head)
    14         {
    15             return NULL;
    16         }
    17 
    18         RandomListNode *current = head;
    19         RandomListNode *copy = NULL;
    20 
    21         while (current) //创建复制链表,并将复制链表的结点连到原结点之后
    22         {
    23             copy = new RandomListNode(current->label);
    24             copy->next = current->next;
    25             current->next = copy;
    26             current = copy->next;
    27         }
    28 
    29         current = head;
    30         
    31         while (current) //设置复制链表结点的random指针
    32         {
    33             if (current->random)
    34             {
    35                 current->next->random = current->random->next;
    36             }
    37             current = current->next->next;
    38         }
    39 
    40         RandomListNode *copyHead = head->next;
    41         current = head;
    42 
    43         while (current) //将原链表和复制链表拆开
    44         {
    45             copy = current->next;
    46             current->next = copy->next;
    47             current = current->next;
    48             if (current)
    49             {
    50                 copy->next = current->next;
    51             }
    52         }
    53 
    54         return copyHead;
    55     }
    56 };
    View Code
  • 相关阅读:
    docker搭建lnmp环境
    通过brew安装docker以及docker的使用
    源码编译安装扩展-phpize详解
    php7废弃mcrypt加密,使用openssl替换
    ubuntu安装docker
    mac 操作系统使用iterm(2)自动登录远程服务器
    linux 用户及用户组管理
    let var const 区别
    ubuntu 升级node和npm 版本
    OLTP与OLAP
  • 原文地址:https://www.cnblogs.com/laihaiteng/p/3950757.html
Copyright © 2011-2022 走看看