• [Leetcode] Copy list with random pointer 对带有任意指针的链表深度拷贝


    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.

    深度复制:

    仅简单的遍历一遍链表时,没法复制random pointer属性。所以有点懵,大神的做法如下,加入个人理解。

    思路:对链表进行三次遍历。

    第一次遍历复制每一个结点,将新结点接在原结点的后面, 让链表变成一个重复链表,新旧交替;

    第二次遍历维护新结点的随机指针,因,新结点是在旧结点之后,所以node->next->random=node->random->next,而node->node结点为新结点,这样,我们就把新结点的随机指针接好了;

    第三次遍历,将两新旧结点分开,因为,构成的重复链表是新旧结点交替出现,故,只要每隔一个节点相连即可,就完成了对链表的分割。如下图:

     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     {
    13         if(head==NULL)  return NULL;
    14 
    15         //第一步,在oldNode的后面插入一个新的结点
    16         RandomListNode *oldNode=head;
    17         while(oldNode !=NULL)
    18         {
    19             RandomListNode *newNode=new RandomListNode(oldNode->label);
    20             newNode->next=oldNode->next;
    21             newNode->random=oldNode->random;
    22             oldNode->next=newNode;
    23             oldNode=newNode->next;  //遍历前行
    24         }    
    25 
    26         //第二步,关联random
    27         oldNode=head;
    28         while(oldNode !=NULL)
    29         {
    30             if(oldNode->random !=NULL)
    31                 oldNode->next->random=oldNode->random->next;
    32             oldNode=oldNode->next->next;
    33         }
    34 
    35         //第三步,分开两链表
    36         RandomListNode *newList=new RandomListNode(0);
    37         newList->next=head;
    38         RandomListNode *pHead=newList;
    39 
    40         oldNode=head;
    41         while(oldNode !=NULL)
    42         {
    43             pHead->next=oldNode->next;
    44             oldNode->next=pHead->next->next;
    45 
    46             pHead=pHead->next;
    47             oldNode=oldNode->next;
    48         }
    49 
    50         return newList->next;
    51     }
    52 };
  • 相关阅读:
    Android UI性能优化详解
    Android开发中一些被冷落但却很有用的类和方法
    Android开发:Translucent System Bar 的最佳实践
    让动画不再僵硬:Facebook Rebound Android动画库介绍
    Android Touch事件传递机制
    转载爱哥自定义View系列--Canvas详解
    Android最佳实践指南
    Android网络请求心路历程
    转载爱哥自定义View系列--文字详解
    ORM是什么?
  • 原文地址:https://www.cnblogs.com/love-yh/p/7009489.html
Copyright © 2020-2023  润新知