輸入一個複雜鏈表(每一個節點中有節點值,以及兩個指針,一個指向下一個節點,另外一個特殊指針指向任意一個節點),返回結果爲複製後複雜鏈表的head。(注意,輸出結果中請不要返回參數中的節點引用,不然判題程序會直接返回空)dom
也就是說這個鏈表,每一個節點除了指向下一個節點的指針,還額外帶了一個指向任意節點的指針。指針
若是先複製出一份只含有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; }