1. 程式人生 > >[劍指offer] 復雜鏈表的復制

[劍指offer] 復雜鏈表的復制

-i while 輸入 輸出 兩個指針 public mar des null

題目描述

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

首先在原鏈表每個結點後邊插入一個結點,其label等於此結點的label,

然後把每一個復制結點的隨機指針指向它復制的那個結點的隨機指針指向的結點的後一個(即其復制結點),

然後將原結點和復制結點分離開即可。

/*
struct RandomListNode {
    int label;
    struct RandomListNode *next, *random;
    RandomListNode(int x) :
            label(x), next(NULL), random(NULL) {
    }
};
*/ class Solution { public: RandomListNode* Clone(RandomListNode* pHead) { if (pHead == NULL) return NULL; // 復制結點 RandomListNode* tmp = pHead; while (tmp != NULL) { RandomListNode* tmpCopy = new RandomListNode(tmp->label); tmpCopy->next = tmp->next; tmp
->next = tmpCopy; tmp = tmpCopy->next; } // 添加隨機指針 tmp = pHead; while (tmp != NULL) { if (tmp->random) tmp->next->random = tmp->random->next; tmp = tmp->next->next; } // 分離結點 RandomListNode* re = pHead->next; tmp
= pHead; while (tmp != NULL) { RandomListNode *tmpCopy = tmp->next; tmp->next = tmpCopy->next; tmp = tmp->next; if (tmp) tmpCopy->next = tmp->next; } return re; } };

[劍指offer] 復雜鏈表的復制