1. 程式人生 > >[劍指offer] 25. 複雜連結串列的複製

[劍指offer] 25. 複雜連結串列的複製

題目描述

輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
思路: 因為新連結串列也需要複製舊連結串列的random指標,而random指向的節點也有其next和random,需要保持連結串列的連貫,所以需要考慮先做出一條新連結串列,再去構建每一個節點的random節點,而如何同步random節點就是問題所在。有兩種解決辦法。 解法一:構建同一連結串列後拆分 1.新舊連結串列構建在一起,形成Z字型 2.為每一個新節點同步random節點 3.分開兩個連結串列
class
Solution { 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;
  }
};