17_7_17:複雜鏈表的複製

思路:
有兩種解決辦法:
第一種:
1,遍歷一次鏈表,構建一條新鏈表,只複製_data以及_next。
2,再次遍歷原來鏈表,獲取每次遍歷節點的_random,在一次循環中,再次遍歷鏈表。獲取_random指向的位置到頭結點的長度。在新鏈表中,也指向相對位置。
時間複雜度:O(n^2)

第二種:
1,遍歷原來的鏈表,每次循環中,在舊節點後面插入一個新節點。添加的新節點的_data是它前驅節點的_data。
2,第二次遍歷構建完成後的新鏈表,將新節點的_random指向屬於舊節點的_random指向節點的_next.
3,根據,奇偶,分離舊鏈表和新鏈表。
時間複雜度:O(n)
這裏寫圖片描述

需要注意的情況:
1,複雜鏈表爲NULL
2,複雜鏈表只有一個節點
3,複雜鏈表有一個以上節點

//這裏採用第二種方法
ComplexNode* Copy(ComplexNode* pHead)
{
    if (NULL == pHead)  //鏈表爲NULL
        return NULL;

    ComplexNode* pNewHead = NULL; //複製所得鏈表的頭結點

    if (NULL == pHead->_next)  //鏈表只要一個節點
    {
        pNewHead = new ComplexNode;
        pNewHead->_data = pHead->_data;
        pNewHead->_next = NULL;
        pNewHead->_random = pHead->_random;
        return pNewHead;
    }

    //1,添加節點,給新節點的_data,_next賦值
    ComplexNode* pCur = pHead;
    while (pCur)
    {
        ComplexNode* pTemp = new ComplexNode;
        pTemp->_data = pCur->_data;
        pTemp->_next = pCur->_next;
        pTemp->_random = NULL;  //暫時不復制

        pCur->_next = pTemp;

        pCur = pTemp->_next;
    }

    //2,給新節點的_random賦值
    pCur = pHead;
    while (pCur)
    {
        //指向隨機指向的節點的後一個節點(新開闢的節點)。
        if (pCur->_random)
            pCur->_next->_random = pCur->_random->_next;
        else
            pCur->_next->_random = NULL;

        pCur = pCur->_next->_next; //每次走兩步
    }

    //3,分離添加節點後的鏈表
    pNewHead = pHead->_next;
    pCur = pHead;   //指向鏈表中的奇數位置
    ComplexNode* pCur_2 = pNewHead; //指向鏈表中的偶數位置
    while (pCur)
    {
        pCur->_next = pCur_2->_next;
        pCur = pCur->_next;

        if (pCur)
        {
            pCur_2->_next = pCur->_next;
            pCur_2 = pCur_2->_next;
        }
    }
    pCur_2->_next = NULL; //注意,最後一個節點的next還是指向舊節點。

    return pNewHead;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章