題意:實現鍊錶的深拷貝,且鍊錶中的每個節點都有乙個指向鍊錶任意節點的指標。
題意解析:這裡面有個深拷貝的概念,深拷貝是產生乙個完完全全的副本,並且原來母本變數不會發生任何改變,這才是深拷貝的實現。解析方法如下,用c++實現
#include
#include
#include
#define nul -1
using namespace std;
// definition for a node.
class node
};//方法一:鍊錶通過迭代的方式來建立,有點複雜,需要遍歷兩次,第一次建立無random值的鍊錶,第二次遍歷完善random值
class solution
for (int i = 0; i < order.size(); i++)
}return resnode;
}int findorder(node*, node*);
};int solution::findorder(node* head, node* ptr)
return i;
}else
return nul;
}//方法二:通過遞迴的方式建立鍊錶,邏輯上更清晰,但時間複雜度上也沒什麼變化,需要遍歷兩次,第一次建立無random值的鍊錶,第二次遍歷完善random值
class solution
}return resnode;
}void createlist(node* &, node*, node*, vector&, vector&);
int findorder(node*, node*);
};void solution::createlist(node* & resnode, node* ptr, node* head, vector& vec, vector& order)
}int solution::findorder(node* head, node* ptr)
return i;
}else
return nul;
}//方法三:網友unordered_map方法,學習使用map(字典)這種方便的資料結構,通過visited方法,就可以避免重複建立,一次遍歷就到位,無需二次遍歷
class solution
void recursion(unordered_map&, node*, node* &);
void createmap(unordered_map&, node*, node* &);
};void solution::createmap(unordered_map& visited, node* old_node, node* & new_node)
}void solution::recursion(unordered_map& visited, node* old_node, node* & new_node)
}//方法四:網友構造新煉表法,該方法時間複雜度最低,且不需要用到vector、unordered_map等之類的容器,只需要在原鍊錶挨個插入新節點即可,最後將這個鍊錶拆分為母本和副本兩個,保證母本不變的原則。雖需遍歷三次,但都很簡單,所以時間複雜度最低
class solution
//第二次遍歷:修改random指標
cur = head;
while (cur)
//第三次遍歷:提取新煉表和舊鍊錶,深拷貝的原則是不改變原來的變數,且產生乙個完全的副本(這個地方容易出錯,忽略了母本不能改變的潛在條件)
node* root = head->next;
cur = head;
while (cur)
return root;}};
PHP遞迴四種方法
data json data str replace data arr json decode data true print r arr dir foreach arr as k v header content type text html charset utf 8 print r arr p...
執行緒同步四種方法
執行緒同步的方法 1 wait 使乙個執行緒處於等待狀態,並且釋放所持有的物件的lock。2 sleep 使乙個正在執行的執行緒處於睡眠狀態,是乙個靜態方法,呼叫此方法要捕捉 interruptedexception異常。3 notify 喚醒乙個處於等待狀態的執行緒,注意的是在呼叫此方法的時候,並...
隨機排序四種方法
var arr 1,3,4,6,8,9,7 function foo arr return clonearr 返回排序後的值 for var i 0 i 10 i 原理 因為sort排序方法是通過 函式的返回值來進行排序的,1是公升序,1是降序,而隨機數的取值範圍是0 1,所以我們將隨機數 0.5,...