劍指offer35--複雜連結串列的複製
阿新 • • 發佈:2018-12-31
題目描述
輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
思路:
雜湊表法
- 先複製一個連結串列,同時用雜湊表儲存所有指標
- 然後再遍歷連結串列,利用雜湊表複製所有指標
/* 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 == nullptr) { return nullptr; } std::unordered_map<RandomListNode*, RandomListNode*> hash_map; RandomListNode* ptmp=pHead; RandomListNode* CopyHead=new RandomListNode(pHead->label); RandomListNode* p1=CopyHead; hash_map[pHead]=CopyHead; pHead=pHead->next; for (RandomListNode* p = pHead; p != nullptr; p = p->next) { RandomListNode* tmp=new RandomListNode(p->label); p1->next=tmp; p1=p1->next; hash_map[p]=p1; } for (RandomListNode* p = ptmp; p != nullptr; p = p->next) { if(p->random!=NULL) hash_map[p]->random=hash_map[p->random]; } return CopyHead; } };
思路:劍指offer上地
先複製,但是複製的都在後面連起來 CloneNode(pHead);
然後連線random指標 ConnectRan(pHead);
最後拆開兩個連結串列 Resconn(pHead);
/* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { } }; */ class Solution { public: void CloneNode(RandomListNode* pHead) { RandomListNode* pNode=pHead; while(pNode!=NULL) { RandomListNode* tmp=new RandomListNode(pNode->label); tmp->next=pNode->next; tmp->random=NULL; pNode->next=tmp; pNode=tmp->next; } } void ConnectRan(RandomListNode* pHead) { RandomListNode* pNode=pHead; while(pNode!=NULL) { RandomListNode* tmp=pNode->next; if(pNode->random!=NULL) tmp->random=pNode->random->next; pNode=tmp->next; } } RandomListNode* Resconn(RandomListNode* pHead) { RandomListNode* pNode=pHead; RandomListNode* CloneHead=NULL; RandomListNode* CloneTmp=NULL; if(pNode!=NULL) { CloneHead=CloneTmp=pNode->next; pNode->next=CloneHead->next; pNode=pNode->next; } while(pNode!=NULL) { CloneTmp->next=pNode->next; CloneTmp=CloneTmp->next; pNode->next=CloneTmp->next; pNode=pNode->next; } return CloneHead; } RandomListNode* Clone(RandomListNode* pHead) { CloneNode(pHead); ConnectRan(pHead); return Resconn(pHead); } };