[劍指offer] 25. 複雜連結串列的複製
阿新 • • 發佈:2018-12-06
題目描述
輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)思路: 因為新連結串列也需要複製舊連結串列的random指標,而random指向的節點也有其next和random,需要保持連結串列的連貫,所以需要考慮先做出一條新連結串列,再去構建每一個節點的random節點,而如何同步random節點就是問題所在。有兩種解決辦法。 解法一:構建同一連結串列後拆分 1.新舊連結串列構建在一起,形成Z字型 2.為每一個新節點同步random節點 3.分開兩個連結串列
classSolution { public: RandomListNode *Clone(RandomListNode *pHead) { if (pHead == NULL) return NULL; RandomListNode *newHead = new RandomListNode(pHead->label); RandomListNode *curNode1 = pHead; RandomListNode *curNode2 = newHead; // 新舊連結串列形成Z鏈 while (curNode1) { curNode2->next = curNode1->next; curNode1->next = curNode2; curNode1 = curNode2->next; curNode2 = curNode1 == NULL ? NULL : new RandomListNode(curNode1->label); } curNode1 = pHead; curNode2 = newHead; // 新鏈新增random while (curNode1) { curNode2->random = curNode1->random == NULL ? NULL : curNode1->random->next; curNode1= curNode2->next; curNode2 = curNode1 == NULL ? NULL : curNode1->next; } curNode1 = pHead; curNode2 = newHead; // 脫鏈 while (curNode1) { curNode1->next = curNode2->next; curNode2->next = curNode1->next == NULL ? NULL : curNode1->next->next; curNode1 = curNode1->next; curNode2 = curNode2->next; } return newHead; } };
解法二:利用雜湊表
先構建新連結串列(label,next),同時雜湊表儲存(舊連結串列節點,新連結串列節點)對映關係
再遍歷一遍舊連結串列,利用雜湊的對映為新連結串列random賦值,oldNode->random = hash[newNode->random]
class Solution { public: RandomListNode *Clone(RandomListNode *pHead) { if (pHead == NULL) return NULL; map<RandomListNode *, RandomListNode *> m; RandomListNode *curNode1 = pHead; RandomListNode *curNode2 = new RandomListNode(curNode1->label); RandomListNode *newHead = curNode2; m[curNode1] = curNode2; while (curNode1) { curNode2->next = curNode1->next == NULL ? NULL : new RandomListNode(curNode1->next->label); curNode1 = curNode1->next; curNode2 = curNode2->next; m[curNode1] = curNode2; } curNode1 = pHead; curNode2 = newHead; while (curNode1) { curNode2->random = m[curNode1->random]; curNode1 = curNode1->next; curNode2 = curNode2->next; } return newHead; } };