面试题36:复杂链表的复制

非 Y 不嫁゛ 提交于 2020-02-27 00:59:34

原地进行复制:时间复杂度O(n),空间复杂度O(1)
第一步:将链表节点复制,并将其链接 eg:1->2->3->4---------1->1->2->2->3->3->4->4
第二步:将自由链接进行链接,N->S可转化为N->N’------>S->S’
第三步:将原节点与复制节点分开,奇节点链接起来,偶节点链接起来

/*
// 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) {
        CloneNodes(head);
        connectRandomNodes(head);
        return ReConnectNodes(head);
    }
    void CloneNodes(Node*head)
    {
        Node*pNode=head;
        while(pNode!=nullptr)
        {
            Node*pCloneNode=new Node(pNode->val);
            pCloneNode->next=pNode->next;
            pCloneNode->random=nullptr;
            pNode->next=pCloneNode;
            pNode=pCloneNode->next;
        }
    }
    void connectRandomNodes(Node*head)
    {
        Node*pNode=head;
        while(pNode!=nullptr)
        {
            Node*pCloned=pNode->next;
            if(pNode->random!=nullptr)
            {
                pCloned->random=pNode->random->next;
            }
            pNode=pCloned->next;
        }
    }
    Node*ReConnectNodes(Node*head)
    {
        Node*pNode=head;
        Node*pCloneHead=nullptr;
        Node*pCloneNode=nullptr;
        if(pNode!=nullptr)
        {
            pCloneHead=pCloneNode=pNode->next;
            pNode->next=pCloneNode->next;
            pNode=pNode->next;
        }
        while(pNode!=nullptr)
        {
            pCloneNode->next=pNode->next;
            pCloneNode=pCloneNode->next;
            pNode->next=pCloneNode->next;
            pNode=pNode->next;
        }
        return pCloneHead;
    }
};
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!