題目:有一個鏈表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的使用方法