剑指 Offer 35. 复杂链表的复制

剑指 Offer 35. 复杂链表的复制

参考:> https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/solution/javashi-xian-jian-zhi-offerliang-chong-si-lu-hashm/

思路

对链表进行深拷贝
1.哈希(空间复杂度O(N))
2.用复制链表再拆开的方法(空间复杂度O(1))
a->b->c->NULL
复制节点
a->a'->b->b'->c->c'->NULL
复制每个节点的random指针,注意a指向b,而a'指向b后面的b'
拆解成两个链表
a->b->c->NULL
a'->b'->c'->NULL

代码

哈希

class Solution {
public:
    Node* copyRandomList(Node* head) {
        if(head==NULL)
            return head;

        unordered_map<Node*,Node*> hash;
        Node* new_head=new Node(head->val);
        Node* pos=head;
        Node* copy=new_head;
        while(pos!=NULL)
        {
            hash[pos]=copy;
            pos=pos->next;
            if(pos==NULL)
            {
                copy->next=NULL;
            }else
            {
                copy->next=new Node(pos->val);
            }
            
            copy=copy->next;
        }


        copy=new_head;
        pos=head;
        while(pos!=NULL)
        {
            copy->random=hash[pos->random];
            copy=copy->next;
            pos=pos->next;
        }

        return new_head;

    }
};

复制链表再拆开

class Solution {
public:
void coutNodes(Node* head)
{
    while(head!=NULL)
    {
        if(head->random==NULL)
        {
            cout<<head->val<<" "<<"NULL"<<endl;
        }else
        {
            cout<<head->val<<" "<<head->random->val<<endl;
        }
        head=head->next;
    }
}
    void copyNode(Node* head)
    {
        while(head!=NULL)
        {
            Node* clone=new Node(head->val);
            clone->next=head->next;
            head->next=clone;

            head=clone->next;
        }
    }

    void copyRandom(Node* head)
    {
        while(head!=NULL)
        {
            Node *random=head->random;
            head=head->next;
            if(random==NULL)
            {
                head->random=NULL;
            }else
            {
                head->random=random->next;
            }
            head=head->next;
        }
    }

    Node* splitNodes(Node* head)
    {
        Node* newHead=head->next;
        Node* copy1=newHead;
        while(copy1!=NULL)
        {
            Node* temp=copy1->next;
            head->next=copy1->next;
            
            if(temp!=NULL)
            {
                copy1->next=temp->next;
                head=temp;
                copy1=temp->next;
            }else{
                copy1->next=NULL;
                head=NULL;
                copy1=NULL;
            }
        }
        return newHead;
    }
    Node* copyRandomList(Node* head) {
        if(head==NULL)
            return NULL;
        copyNode(head);
        //coutNodes(head);
        copyRandom(head);
        //coutNodes(head);
        Node* res= splitNodes(head);
        //coutNodes(res);
        return res;
    }
};

posted @ 2020-10-21 01:05  韩天尊  阅读(61)  评论(0)    收藏  举报