zoukankan      html  css  js  c++  java
  • Copy List with Random Pointer -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.

    /**
     * Definition for singly-linked list with a random pointer.
     * struct RandomListNode {
     *     int label;
     *     RandomListNode *next, *random;
     *     RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
     * };
     */

     解题思路:

      一般列表deep copy(不只是copy一个head,而是对每个node的创建复制) 只需创建节点并把value和*next赋值即可。但是这里的node 包含一个*random成员,他可以随意指向列表中的任何一个node或者NULL,需要将原列表中的*random对应到新的列表中。

    我的思路:

        1、先通过new创建一个新的head,取名为 result。  

        2、deep copy 原列表,不考虑成员: random

        3、通过定义两个指针遍历 head和result。寻找某个成员random的方法:定义指针*p *q,他们从head和result同时移动,源列表中移动*random 项,则目的列表的也是对应成员的*random。

    class Solution {
    public:
      RandomListNode *copyRandomList(RandomListNode *head) {
            if(head==NULL)
                return NULL ;
            else {
                 RandomListNode *temp =new RandomListNode (head->label) , *ptr,*result;
                 ptr=head;
                 result=temp;
               while(ptr->next!=NULL){
                temp->next  = new RandomListNode (ptr->next->label);  
                ptr = ptr->next;
                temp= temp->next; 
               }
               ptr=head;
               temp=result;
               while(ptr!=NULL)
               {
                   if(ptr->random!=NULL)
                   {
                       RandomListNode *p=head , *q=result;
                       while(p->next!=NULL)
                       {
                           if(p==ptr->random)
                            {
                                temp->random = q;                     
                                break;
                            }   
                            p  = p->next;
                            q  = q->next;
                       }
                       temp->random = q;
                   }
                   ptr = ptr->next;
                   temp= temp->next;
               }           
                return result;
            }       
        }
    };

    其他思路(更好):

     1、 在每个节点后面插入一个新的节点,这个节点label,random是前一个节点的拷贝

     2、将新节点的random = random->next;

     3 、将新创建的节点按序组成一个链表

                                

    class Solution {
    public:
        RandomListNode *copyRandomList(RandomListNode *head) {
            RandomListNode *tHead = head;
            RandomListNode *next = NULL;
            while(tHead)
            {
                next = tHead->next;
                RandomListNode *node = new RandomListNode(tHead->label);
                node->next = tHead->next;
                //node->random = tHead->random;
                tHead->next = node;
                tHead= next;
            }
            tHead = head;
            while(tHead)
            {
                if(tHead->random) tHead->next->random = tHead->random->next;
                tHead = tHead->next->next;
            }
            RandomListNode *retHead = NULL;
            RandomListNode *tRet = NULL;
             
            tHead = head;
            RandomListNode *next2 = NULL;
            while(tHead)
            {
                if(retHead == NULL)
                {  
                    next2 = tHead->next->next;
                    retHead = tHead->next;
                    tRet = retHead;
                    tHead->next = next2;
                    tHead = next2;
                }
                else
                {
                    next2 = tHead->next->next;
                    tRet->next = tHead->next;
                    tHead->next = next2;
                    tHead = next2;
                    tRet = tRet->next;
                }
     
            }
            return retHead;
        }
    };

        

  • 相关阅读:
    Asp.Net Core, Angular 4 CLI站点部署
    .Net ViewState Workflow
    wpf附加属性理解
    wpf使用truetype字体ttf
    wpf 依赖属性注册解释
    wpf控件开发基础
    wpf path语法
    Adorner的收集
    正确理解WPF中的TemplatedParent (转贴)
    “/usr/local/var/run/nginx.pid” failed
  • 原文地址:https://www.cnblogs.com/NeilZhang/p/5344708.html
Copyright © 2011-2022 走看看