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

原地进行复制:时间复杂度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;
    }
};
发布了107 篇原创文章 · 获赞 28 · 访问量 1955

猜你喜欢

转载自blog.csdn.net/qq_38994205/article/details/104525076