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

    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的节点。看了别人的做法,豁然开朗。unordered_map存储的是本链表的某个节点和复制之后的链表对应的节点,即链表的第二个节点对应复制链表的第二个节点(深度复制,那当然两个节点一样)。第一步完成之后,链表的next域全部复制完成,同时节点也对应起来了。第二步,假设p1与p2为对应的节点,那么p1->random节点也会对应p2->random,所以又map[p1]->random = map[p1->random]。

    题解:

    /**
     * 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) {}
     * };
     */
    class Solution {
    public:
        RandomListNode *copyRandomList(RandomListNode *head) {
            if(head==NULL)
                return NULL;
            unordered_map<RandomListNode*, RandomListNode*> map;
            RandomListNode *head2 = new RandomListNode(head->label);
            RandomListNode *p1 = head, *p2 = head2;
            map[p1] = p2;
            p1 = p1->next;
            while(p1) {
                RandomListNode *tmp = new RandomListNode(p1->label);
                map[p1] = tmp;
                p2->next = tmp;
                p2 = tmp;
                p1 = p1->next;
            }
            p1 = head;
            while(p1) {
                if(p1->random)
                    map[p1]->random = map[p1->random];
                p1 = p1->next;
            }
            return head2;
        }
    };
    View Code

    后话:

    还是参考了一篇博客。上面的方法空间复杂度为O(n),还有一种O(1)的方法,感觉太牛逼了,看看就好,第一种方法要吃透,哈希表存储的新旧两个对应的节点很值得学习。

    /**
     * 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) {}
     * };
     */
    class Solution {
    public:
        RandomListNode *copyRandomList(RandomListNode *head) {
            if(head==NULL)  return head;
            RandomListNode *pos1 = head, *pos2 = head->next;
            while(pos1!=NULL) {
                pos1->next = new RandomListNode(pos1->label);
                pos1->next->next = pos2;
                pos1 = pos2;
                if(pos2!=NULL)
                    pos2 = pos2->next;
            }
            pos1 = head;
            pos2 = head->next;
            while(pos1!=NULL) {
                if(pos1->random==NULL)
                    pos2->random==NULL;
                else
                    pos2->random = pos1->random->next;
                pos1 = pos2->next;
                if(pos2->next!=NULL)
                    pos2 = pos2->next->next;
            }
            RandomListNode *res = head->next;
            pos1 = head;
            pos2 = res;
            while(pos2->next!=NULL) {
                pos1->next = pos2->next;
                pos1 = pos2->next;
                pos2->next = pos1->next;
                pos2 = pos1->next;
            }
            pos1->next = NULL;
            pos2->next = NULL;
            return res;
        }
    };
    View Code
  • 相关阅读:
    JS实现动画的四条优化方法
    如果全球的沙子都对你发起DDoS攻击,如何破?
    阿里云实时计算的前世“功”今生“能”
    IPv6时代已来:双十一中的IPv6大规模应用实践
    支撑双十一的网络引擎:飞天洛神
    【阿里云总监课第四期】时髦的云原生应用怎么写?
    阿里云重磅发布RDS for SQL Server AlwaysOn集群版
    4K超清,2500万人在线,猫晚直播技术全解读
    猫晚流量再创记录,阿里云直播方案护航优酷2500万用户体验
    TableStore最佳实践:轻松实现轨迹管理与地理围栏
  • 原文地址:https://www.cnblogs.com/jiasaidongqi/p/4267170.html
Copyright © 2011-2022 走看看