JavaScript資料結構:鏈結串列

鏈結串列是你可以學習到的最重要的資料結構之一。 在鏈結串列中,每個項目都包含對其後繼項目的引用。 我們可以從串列的開始處,即「頭部」,開始迭代遍歷所有項目,直到達到末尾(即「尾部」)。 相較於陣列,在低階程式語言中,項目並不相鄰於實際的記憶體位置,且沒有索引可供我們隨機訪問陣列中的項目。 我們無法在不從開始的情況下引用列表中的中間項目,因為我們不知道如何引用它。 JavaScript本身並沒有鏈結串列的實作,因此我們現在將創建一個。 首先,我們創建一個會成為鏈結串列中每個項目的容器的Item類別: class Item { next = null value = null constructor(value) { this.value = value } } 我們有一個指向鏈結串列中下一個項目的指標,以及該項目的值。 然後,我們定義一個LinkedList類別,該類別將擁有兩個私有值:head和tail。 我們定義了一個append()方法,用於將項目添加到串列中。如果它是第一個添加的項目,該項目同時是串列的頭部和尾部。否則,我們創建該項目並將其分配給尾部項目的next屬性: class LinkedList { #head = null #tail = null append = (value) => { const item = new Item(value) if (!this.#head) { this.#head = item this.#tail = item return } this.#tail.next = item this.#tail = item } size = () => { let count = 1 let item = this....

Python 字典

字典是一種非常重要的 Python 資料結構。 列表可以用來創建值的集合,而字典則可以創建鍵 / 值對的集合。 這是一個包含一個鍵值對的字典範例: dog = { 'name': 'Roger' } 鍵可以是任何不可變的值,例如字串、數字或元組。值可以是任何你想要的資料。 字典可以包含多個鍵值對: dog = { 'name': 'Roger', 'age': 8 } 你可以使用下面的語法來訪問單個鍵的值: dog['name'] # 'Roger' dog['age'] # 8 使用相同的語法,你可以更改特定位置存儲的值: dog['name'] = 'Syd' 另一種方法是使用 get() 方法,該方法可以添加默認值: dog.get('name') # 'Roger' dog.get('test', 'default') # 'default' pop() 方法檢索鍵的值,並從字典中刪除該項目: dog.pop('name') # 'Roger' popitem() 方法檢索並刪除最後插入字典的鍵/值對: dog.popitem() 你可以利用 in 運算符來檢查一個鍵是否包含在字典中: 'name' in dog # True 使用 keys() 方法可以獲取字典中的所有鍵,並將結果傳遞給 list() 構造函數: list(dog.keys()) # ['name', 'age'] 使用 values() 方法可以獲取字典中的所有值,並使用 items() 方法獲取鍵/值對的元組:...

Python 集合

集合是Python中另一個重要的資料結構。 我們可以說它們和元組(tuples)的運作方式相似,但它們並不是有序的,且它們是可變的。 或者我們可以說它們和字典(dictionaries)的運作方式相似,但它們沒有鍵(keys)。 它們還有一個不可變的版本,稱為frozenset。 你可以使用以下語法來建立一個集合: names = {"Roger", "Syd"} 當你把集合當作數學集合時,它們的運作效果很好。 你可以取兩個集合的交集: set1 = {"Roger", "Syd"} set2 = {"Roger"} intersect = set1 & set2 #{'Roger'} 你可以將兩個集合合併: set1 = {"Roger", "Syd"} set2 = {"Luna"} union = set1 | set2 #{'Syd', 'Luna', 'Roger'} 你可以獲取兩個集合之間的差異: set1 = {"Roger", "Syd"} set2 = {"Roger"} difference = set1 - set2 #{'Syd'} 你可以檢查一個集合是否為另一個集合的超集(當然也可以檢查一個集合是否為另一個集合的子集): set1 = {"Roger", "Syd"} set2 = {"Roger"} isSuperset = set1 > set2 # True 你可以使用len()全局函數計算集合中的項目數量:...

如何從 JavaScript 陣列中移除重複值

給定一個陣列,你該如何將其中的重複值移除? 假設你有一個包含一系列基本值的陣列,例如數字或字串。 其中一些元素是重複的。 就像這個例子中: const list = [1, 2, 3, 4, 4, 3] 我們可以使用以下方式產生一個新的陣列,其中不包含重複的值: const uniqueList = [...new Set(list)] 現在,uniqueList 將成為一個新的陣列,其中包含值 [1, 2, 3, 4]。 這是如何運作的呢? Set 是一種新的資料結構,在 ES6 中的 2015 年被引入,它的主要特點是能夠在同一個集合中不能重複儲存資料。請參考我關於 Set 的完整指南。 通過使用解構陣列的方式初始化一個 Set(請看到 ... 操作符在 new Set() 前面),我們將值傳入 Set 中,Set 會自動移除重複的值。然後我們將其轉換為一個陣列,使用方括號 [] 包裹起來。 這個方法對於任何不是物件的值都適用:數字、字串、布林值、符號。

完整指南:Go 資料結構

本週,我在這個部落格的各種文章中,發布了使用 Go 實作經典資料結構的分析和實現。 每個資料結構都在單獨的文章中進行描述,而這篇文章則作為索引。 已涵蓋的資料結構,按字母順序排列如下: 二元搜尋樹 字典 圖 哈希表 鏈結串列 佇列 集合 堆疊