1. 程式人生 > >25、劍指offer--復雜鏈表的復制

25、劍指offer--復雜鏈表的復制

and pac 技術分享 程序 offer ext 裏的 family img

題目描述 輸入一個復雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針指向任意一個節點),返回結果為復制後復雜鏈表的head。(註意,輸出結果中請不要返回參數中的節點引用,否則判題程序會直接返回空) 思路:直接把復制的node放在原node的後面,這樣結構變為: 技術分享 上面為第一次遍歷,第二次遍歷時把紅色的新node的random域賦值,規則是: newNode->ranodm = oldNode->random->next; 然後第三次遍歷把上面的鏈表拆分為兩個即可。代碼如下:
 1 /**
 2  * Definition for singly-linked list with a random pointer.
3 * struct RandomListNode { 4 * int label; 5 * RandomListNode *next, *random; 6 * RandomListNode(int x) : label(x), next(NULL), random(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 RandomListNode *copyRandomList(RandomListNode *head) { 12 RandomListNode *newList = NULL;
13 RandomListNode *newHead = NULL; 14 RandomListNode *p = head; 15 16 if(head==NULL) 17 return NULL; 18 //把每一個新的結點放入舊結點後面 19 while(p!=NULL) 20 { 21 RandomListNode *q = new RandomListNode(p->label); 22 q->next = p->next;
23 p->next = q; 24 25 p = q->next; 26 } 27 28 p = head; 29 //在新結點中加入random 30 while(p!=NULL) 31 { 32 if(p->random != NULL) 33 p->next->random = p->random->next; 34 p = p->next->next;//此時p需要跳兩步才到舊的下一節點 35 } 36 p = head; 37 //註意這裏的條件,首先要判斷p是否為null 38 while(p!=NULL && p->next!=NULL) 39 { 40 if(p==head) 41 { 42 newHead = p->next; 43 newList = newHead; 44 } 45 else 46 { 47 newList->next = p->next; 48 newList = newList->next; 49 } 50 51 52 p->next = newList->next; 53 p = p->next; 54 //如果使用p = newList->next;替換以上兩步,則會改變原鏈表,錯誤 55 56 } 57 58 return newHead;//返回值是newHead而不是newList,因為此時newList指向尾部 59 } 60 };

25、劍指offer--復雜鏈表的復制