劍指offer-26.複雜鏈表的複製

0 題目

輸入一個複雜鏈表(每一個節點中有節點值,以及兩個指針,一個指向下一個節點,另外一個特殊指針指向任意一個節點),返回結果爲複製後複雜鏈表的head。(注意,輸出結果中請不要返回參數中的節點引用,不然判題程序會直接返回空)dom

1 分析

也就是說這個鏈表,每一個節點除了指向下一個節點的指針,還額外帶了一個指向任意節點的指針。指針

若是先複製出一份只含有next指針的鏈表,而後再進行額外指針的賦值,那麼複雜度應該是O(n^2)blog

 

所以,先原位複製一份ABC鏈表,複製爲AABBCCclass

而後,將複製的鏈表的額外指針,指向下一個節點。List

再拆分鏈表。引用

RandomListNode *Clone(RandomListNode *pHead)
{
    // 提早返回
    if (pHead == nullptr)
    {
        return nullptr;
    }
    RandomListNode *cur = pHead;

    // 複製,ABC變爲AABBCC
    while (cur != nullptr)
    {
        RandomListNode *tmp_for_next = cur->next;
        // 這裏能夠不用拷貝 random
        cur->next = new RandomListNode(cur->label);
        cur->next->next = tmp_for_next;
        cur = tmp_for_next;
    }

    // 改變 random
    cur = pHead;

    while (cur != nullptr)
    {
        if (cur->random != nullptr)
        {
            cur->next->random = cur->random->next;
        }
        cur = cur->next->next;
    }

    // 拆分
    RandomListNode* head_copy=pHead->next;
    RandomListNode *tmp;
    cur = pHead;
    while (cur->next != nullptr)
    {
        tmp = cur->next;
        cur->next = cur->next->next;
        cur = tmp;
    }
    return head_copy;
}
相關文章
相關標籤/搜索