最近面試老是遇到陣列和鍊錶。
1.鍊錶是什麼?
鍊錶是一種乙個元素通過指標指向另外乙個元素來做元素之間的連線。
一般分為
a單向鍊錶:
單向鍊錶包含兩個域,乙個是資訊域,乙個是tail指標域。也就是單向鍊錶的節點被分成兩部分,一部分是儲存或顯示關於節點的資訊,第二部分儲存下乙個節點的位址,而最後乙個節點則指向乙個空值。
b:雙向鍊錶
比單項鍊表多乙個指標域,有head指標域指向前乙個節點,tail指標域指向後乙個節點。
c:迴圈鍊錶
迴圈鍊錶就是首節點和末節點被連線在一起。迴圈鍊錶中第乙個節點之前就是最後乙個節點,反之亦然。
2.陣列是什麼?
陣列沒有指標域,它是把所有元素按次序依次儲存的。沒錯,它在物理上就是連續的記憶體域。
思考題之前有人遇到這麼乙個問題,明明伺服器上還有200m的空間,但是當他建立乙個大概100m的陣列的時候就報記憶體溢位了,為什麼呢?
區別:一般來說陣列
插入慢:因為它要插入的時候是要挪動插入位置後面的元素。
查詢快:因為是連續記憶體確實快
但真的是這樣的嗎?
首先插入不一定陣列就慢,看你怎麼插入,如果是不需要移動任何元素的情況下,陣列是可以完爆鍊錶的,比如向陣列後方插入。
之前碰到乙個面試官問,現在要你插入10w 條資料,用哪個集合最快?
當時我說陣列,面試官很鄙夷的說錯了,陣列是最慢的。
確實如果按照常理來說陣列插入需要移動元素,擴容時又需要另外開闢記憶體空間將原來的資料複製一遍,這樣看來確實是最慢的。
但是如果你早就知道資料量那完全沒必要給它機會擴容,另外向陣列後方插入無需移動的情況下陣列是秒殺其他資料結構的。
陣列與鍊錶的區別
來自網路 c 語言中可以用陣列處理一組資料型別相同的資料,但不允許動態定義陣列的大小,即在使用陣列之前必須確定陣列的大小。而在實際應用中,使用者使用陣列之前有時無法準確確定陣列的大小,只能將陣列定義成足夠大小,這樣陣列中有些空間可能不被使用,從而造成記憶體空間的浪費。鍊錶是一種常見的資料組織形式,它...
鍊錶與陣列的區別
鍊錶和陣列一樣是一種資料結構。陣列是將元素在記憶體中連續存放,由於每個元素占用記憶體相同,所以可以通過下標迅速訪問陣列中任何元素。但是如果要在陣列中增加乙個元素,需要移動大量元素,在記憶體中空出乙個元素的空間,然後將要增加的元素放在其中。同樣的道理,如果想刪除乙個元素,同樣需要移動大量元素去填掉被移...
陣列與鍊錶的區別
1.基於空間的考慮 陣列的儲存空間是靜態,連續分布的,估計過大造成空間浪費,估計太小又將使空間溢位機會增多。而鍊錶的儲存空間是動態分布的,只要記憶體空間尚有空閒,就不會產生溢位 鍊錶中每個節點除了資料域外,還有指標域,儲存密度小於1 陣列為 儲存空間利用率就越高。2.基於時間的考慮 陣列中任意節點都...