輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的head。
阿新 • • 發佈:2019-02-09
本題源自LeetCode
--------------------------------------------
1 先複製節點,讓複製節點插入節點的後面。
2 調整隨機指標,複製節點的隨機指標指向節點隨機指標的下一個節點
3 將連結串列拆分開
RandomListNode *copyRandomList(RandomListNode *head) { cloneListNode(head); cloneRandom(head); return reconnectNodes(head); } //複製節點,在節點的後面 void cloneListNode(RandomListNode *head){ RandomListNode *p=head; while(p!=NULL){ RandomListNode *cloneNode=new RandomListNode(p->label); cloneNode->next=p->next; cloneNode->random=NULL; p->next=cloneNode; p=cloneNode->next; } } //複製隨機指標 void cloneRandom(RandomListNode *head){ RandomListNode *p=head; while(p!=NULL){ RandomListNode *cloneNode=p->next; if(p->random!=NULL) cloneNode->random=p->random->next; p=cloneNode->next; } } //拆分連結串列 RandomListNode* reconnectNodes(RandomListNode* head){ if(head == NULL) return NULL; RandomListNode* p=head; RandomListNode *cloneHead=p->next; RandomListNode *cloneNode=cloneHead; p->next=cloneNode->next; p=p->next; while(p!=NULL){ cloneNode->next=p->next; cloneNode=cloneNode->next; p->next=cloneNode->next; p=p->next; } return cloneHead; }