deep copy 帶有random的linklist

題目:有一個鏈表L,其每個節點有2個指針,一個指針next指向鏈表的下個節點,另一個random隨機指向鏈表中的任一個節點,可能是自己或者爲空,寫一個程序,要求複製這個鏈表的結構並分析其複雜性

解決方法一:

O(n)的複雜度,掃面兩邊即可。缺點:修改了原始的鏈表


                                                              圖【2】

如圖【2】所示,ABCD是原來的鏈表,A’B’C’D’是複製的鏈表,第一遍掃描順序複製next指針,把ABCD的next分別指向A’B’C’D’,將A’的next指針指向B,B’的next指針指向C,依次類推

複製random指針: A’->random=A->random->next

恢復:A->next=A’->next;A’->next=A’->next->next;

Node* copylist(Node* head){
 if (head == NULL)
       return NULL;
 
 Node* current = head;
 Node* originalNext = NULL;
 Node* newHead = NULL;
 Node* newcurrent = NULL;
 
 while (current){
   originalNext = current->next;
   Node* newNode = new Node(current->val);
   current->next = newNode;
   current = originalNext;
   if (newHead == NULL)
     newHead = newNode;
   newcurrent = newHead;
   newNode->next = current;
 }
 
 current = head;
 newcurrent = newHead;
 while(current){
   newcurrent -> random = current->random->next;
   current = current->next->next;
   newcurrent->next = newcurrent->next->next;
   newcurrent = newcurrent->next;
 }
}

解法2: 如果不能修改原始鏈表的值,用哈希函數,先依次遍歷原鏈表,每經過一個節點X,開闢一個新節點Y,然後(key=X的地址,value=Y的地址)存入哈希表。第二次再遍歷原鏈表,根據拓撲結構設置新的鏈表。需要O(n)的空間,時間也是O(n)。

01 Node* copyList(Node* head)
02 {
03     if(head==NULL)
04         return NULL;
05     Node* tmp=head;
06     int index=;
07     map<Node*,int> m;
08     vector<Node*> v;
09     m[tmp]=index++;
10     Node* hd=new Node(head->val);
11     v.push_back(hd);
12     Node* prv=hd;
13     tmp=tmp->next;
14     while(tmp){
15         m[tmp]=index++;
16         Node* enode=new Node(tmp->val);
17         v.push_back(enode);
18         prv->next=enode;
19         prv=enode;
20         tmp=tmp->next;
21     }
22     tmp=hd;
23     while(tmp){
24         tmp->rand=v[m[head->rand]];
25         tmp=tmp->next;
26         head=head->next;
27     }
28     return hd;
29 }

這裏用了一個map和vector共同實現hash表,注意map的使用方法












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章