1. 程式人生 > >劍指Offer——復雜鏈表的復制

劍指Offer——復雜鏈表的復制

class rand col bsp 題目 pub 程序 輸出 劍指offer

題目描述:

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


分析:

復制鏈表的復制分為3個步驟:

  1. 復制鏈表的每個結點到它們的結點的後面,如A->B->C->D變成A->A->B->B->C->C->D->D。
  2. 將復制出來的鏈表的每個結點的random指針指向原鏈表的每個結點的random指針指向的下一個位置。
  3. 拆分鏈表,成為兩個鏈表。


代碼:

 1 /*
 2 struct RandomListNode {
3 int label; 4 struct RandomListNode *next, *random; 5 RandomListNode(int x) : 6 label(x), next(NULL), random(NULL) { 7 } 8 }; 9 */ 10 class Solution { 11 public: 12 RandomListNode* Clone(RandomListNode* pHead) { 13 if(pHead == NULL) return NULL; 14 RandomListNode* p = pHead;
15 while(p) { // 復制鏈表的每個結點接在相同結點的後面,如A->B->C->D變成A->A->B->B->C->C->D->D 16 RandomListNode* pClone = new RandomListNode(p->label); 17 pClone->next = p->next; 18 p->next = pClone; 19 p = pClone->next; 20
} 21 p = pHead; 22 RandomListNode* pClone = pHead->next; 23 while(p) { // 使復制出來的結點的random指針,指向相應的位置 24 if(p->random) pClone->random = p->random->next; 25 p = pClone->next; 26 if(p) pClone = p->next; 27 } 28 RandomListNode* head = pHead->next; 29 p = pHead; 30 pClone = head; 31 while(p) { // 拆分鏈表,成為一個新的鏈表,完成鏈表的復制 32 p->next = pClone->next; 33 p = pClone->next; 34 if(p) { 35 pClone->next = p->next; 36 pClone = p->next; 37 } 38 } 39 return head; 40 } 41 };

劍指Offer——復雜鏈表的復制