leetcode 138四種方法解析

2021-10-07 11:33:10 字數 1907 閱讀 8282

題意:實現鍊錶的深拷貝,且鍊錶中的每個節點都有乙個指向鍊錶任意節點的指標。

題意解析:這裡面有個深拷貝的概念,深拷貝是產生乙個完完全全的副本,並且原來母本變數不會發生任何改變,這才是深拷貝的實現。解析方法如下,用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,...