leetcode演算法題:複雜連結串列的複製
阿新 • • 發佈:2021-01-14
題目:
請實現 copyRandomList 函式,複製一個複雜連結串列。在複雜連結串列中,每個節點除了有一個 next 指標指向下一個節點,還有一個 random 指標指向連結串列中的任意節點或者 null。
示例 1:
輸入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
輸出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
題解:假設原結點為A-B-C-D-E
複製後的結點為A’-B’-C’-D’-E’
一共分為三個步驟
1、複製每個結點,而且讓每個複製後的結點接在被複制的節點後面:
A-A’-B-B’-C-C’-D-D’-E-E’
3、將複製的連結串列從長連結串列中剝離出來
/* // Definition for a Node. class Node { public: int val; Node* next; Node* random; Node(int _val) { val = _val; next = NULL; random = NULL; } }; */ class Solution { public: Node* copyRandomList(Node* head) { //1.1判斷null表 if (NULL == head) return head; //1.2定義一個複製表頭 Node* cur = head; while (cur != NULL) { //1.3拷貝一個copynode的值為A',假設原連結串列的值為A Node* copyNode = new Node(cur->val); //1.4將這個copynode插入到A後面 copyNode->next = cur->next; cur->next = copyNode; //1.5更新這個被拷貝的節點,即為A->A'->B,cur就是被拷貝的結點指標 cur = cur->next->next; } //2.1現在得到一個拷貝後的連結串列,下面就是將這個連結串列的random同樣複製一次 cur = head;//找到頭部 while(cur != NULL) { if (cur->random != NULL) { //2.2將cur(A)的random指標(D)的拷貝指標(D') 交給 cur.next(A')指標 cur->next->random = cur->random->next; } //2.3更新cur(A)的資料,也就是把它更新成B,也就是後兩位的next cur = cur->next->next; } //3.1現在得到一個連結串列,包含兩份完全相同的資料元素,A-A'-B-B'-C-C'-D-D'-E-E' //現在把他們拆開,只留下複製後的那個連結串列 A-B-C-D-E和A'-B'-C'-D'-E' cur = head;//3.2先找到頭結點 Node* copyHead = head->next; Node* copyCur = head->next; while (cur != NULL) { //3.3 cur:切斷A-A' cur->next = cur->next->next; //3.4 更新cur,變成B---- cur = cur->next; //3.5 copycur:切斷A'-B if (copyCur->next != NULL) { copyCur->next = copyCur->next->next; //3.6 更新curcopy,變成B'------ copyCur = copyCur->next; } } return copyHead; } };