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
  • 相关阅读:
    _STORAGE_WRITE_ERROR_:./Application/Runtime/Cache/Home/f8995a0e1afcdadc637612fae5a3b585.php
    git 报错:没有权限 remote: error: unable to unlink old 'README.md' (Permission denied)
    深度学习入门实战(二)-用TensorFlow训练线性回归
    一条SQL搞定信息增益的计算
    Vue.js动画在项目使用的两个示例
    腾讯云安全:开发者必看|Android 8.0 新特性及开发指南
    腾讯云上Selenium用法示例
    一个只有99行代码的JS流程框架
    腾讯云上PhantomJS用法示例
    前端开发框架简介:angular和react
  • 原文地址:https://www.cnblogs.com/jiasaidongqi/p/4267170.html
Copyright © 2011-2022 走看看