美文网首页
剑指offer 35 拷贝复杂链表

剑指offer 35 拷贝复杂链表

作者: 再凌 | 来源:发表于2020-05-03 20:42 被阅读0次

    请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

    我用的方法是: 使用哈希记录当前链表是否被拷贝过

    /*
    // Definition for a Node.
    class Node {
    public:
        int val;
        Node* next;
        Node* random;
        
        Node(int _val) {
            val = _val;
            next = NULL;
            random = NULL;
        }
    };
    */
    class Solution {
    public:
        Node* copyRandomList(Node* head) {
            if(!head) return NULL;
    
            Node *p = head, *newp,*temp;
    
            map<Node*, Node*> Hash;
            Node* newhead = new Node(head->val);
            p = head->next;
            newp = newhead;
            Hash.insert(pair<Node*, Node*>(head,newhead));
            while(p)
            {
                auto check = Hash.find(p);
                //hash表中没存next
                if(check == Hash.end())
                {
                    temp = new Node(p->val);
                    newp->next = temp;
                    Hash.insert(pair<Node*, Node*>(p, newp->next));
                }
                else{
                    newp->next = check->second;
                }
                
                if(p->random)
                {
                    check =Hash.find(p->random);
                    //hash表没有存random
                    if(check == Hash.end())
                    {
                        temp = new Node(p->random->val);
                        newp->next->random = temp;
                        Hash.insert(pair<Node*, Node*>(p->random, newp->next->random));
                    }
                    else{
                        newp->next->random = check->second;
                    }
                }
                
                newp = newp->next;
                
                p = p->next;
                
            }
            
            if(head->random)
            {
                newhead->random = (Hash.find(head->random))->second;
            }
    
            return newhead;
    
            
        }
    };
    

    时间复杂度: N
    空间复杂度: N(额外空间存储哈希)

    另外一种方法是: 将新链表逐个插入到老链表中, 形成1-> 1'-> 2-> 2'-> 3-> 3'. 后面就不用说了吧?
    一定不能忘了实现

    相关文章

      网友评论

          本文标题:剑指offer 35 拷贝复杂链表

          本文链接:https://www.haomeiwen.com/subject/dbpjghtx.html