演算法圖解筆記2-陣列和連結串列
我們繼續上文的腳步,深入瞭解一下陣列和連結串列。掌握它們之間的區別和聯絡,以及各自的使用場景,為後續的演算法學習打好基礎。
一、計算機記憶體的工作原理
為了更好的理解陣列和連結串列,我們先來簡單介紹一下計算機記憶體的工作原理。
簡單來說:計算機就像是很多抽屜的集合體,每個抽屜都有地址。
需要將資料儲存到記憶體時,你請求計算機提供儲存空間,計算機給你一個儲存地址。需要儲存多項資料時,有兩種基本方式:陣列和連結串列。
二、陣列
我們先不看概念,來個小例子簡單認識一下。
假設我們要編寫一個管理待辦事項的應用程式,為此需要將這些待辦事項儲存在記憶體中。我們先將待辦事項儲存在陣列中。使用陣列意味著所有待辦事項在記憶體中都是相連的(緊靠在一起的)。

現在假設你要新增第四個待辦事項,但後面的那個抽屜放著別人的東西!在這種情況下,你需要請求計算機重新分配一塊可容納 4 個待辦事項的記憶體,再將所有待辦事項都移到那裡。
那麼問題來了,如果我又有了第 5 個待辦事項,這時候,又得進行一次大轉移。
那麼有沒有什麼解決方案呢?答案是肯定的,但是並不完美。譬如,我們直接申請 10 個記憶體單元,這樣就可以繼續6,7,8,9,10。
這是一個不錯的權變措施,但是它存在如下兩個缺點:
1.你額外請求的位置可能根本用不上,這將浪費記憶體。你沒有使用,別人也用不了。
2.待辦事項超過 10 個後,你還得轉移。
看起來我們的方案並不完美,那麼有什麼好的辦法嗎?
三、連結串列
連結串列中的元素可儲存在記憶體的任何地方。
我們繼續用上面的例子:

連結串列的每個元素都儲存了下一個元素的地址,從而使一系列隨機的記憶體地址串在一起。
這猶如尋寶遊戲。你前往第一個地址,那裡有一張紙條寫著“下一個元素的地址為123”。因此,你前往地址123,那裡又有一張紙條,寫著“下一個元素的地址為847”,以此類推。在連結串列中新增元素很容易:只需將其放入記憶體,並將其地址儲存到前一個元素中。
只要有足夠的記憶體空間,就能為連結串列分配記憶體。
連結串列的優勢在插入元素方面,那陣列的優勢又是什麼呢?