【原文】http://www.2cto.com/kf/201605...html
數組 是將元素在內存中連續存放,因爲每一個元素佔用內存相同,能夠經過下標迅速訪問數組中任何元素。可是若是要在數組中增長一個元素,須要移動大量元素,在內存中空出一個元素的空間,而後將要增長的元素放在其中。一樣的道理,若是想刪除一個元素,一樣須要移動大量元素去填掉被移動的元素。若是應用須要快速訪問數據,不多插入和刪除元素,就應該用數組。程序員
鏈表 中的元素在內存中不是順序存儲的,而是經過存在元素中的指針聯繫到一塊兒,每一個結點包括兩個部分:一個是存儲 數據元素 的 數據域,另外一個是存儲下一個結點地址的 指針。
若是要訪問鏈表中一個元素,須要從第一個元素開始,一直找到須要的元素位置。可是增長和刪除一個元素對於鏈表數據結構就很是簡單了,只要修改元素中的指針就能夠了。若是應用須要常常插入和刪除元素你就須要用鏈表。數組
數組從棧中分配空間, 對於程序員方便快速,但自由度小。數據結構
鏈表從堆中分配空間, 自由度大但申請管理比較麻煩. 指針
數組必須事先定義固定的長度(元素個數),不能適應數據動態地增減的狀況。當數據增長時,可能超出原先定義的元素個數;當數據減小時,形成內存浪費。 htm
鏈表動態地進行存儲分配,能夠適應數據動態地增減的狀況,且能夠方便地插入、刪除數據項。(數組中插入、刪除數據項時,須要移動其它數據項) 排序
一、存取方式上,數組能夠順序存取或者隨機存取,而鏈表只能順序存取; 隊列
二、存儲位置上,數組邏輯上相鄰的元素在物理存儲位置上也相鄰,而鏈表不必定; 內存
三、存儲空間上,鏈表因爲帶有指針域,存儲密度不如數組大; get
四、按序號查找時,數組能夠隨機訪問,時間複雜度爲O(1),而鏈表不支持隨機訪問,平均須要O(n);
五、按值查找時,若數組無序,數組和鏈表時間複雜度均爲O(n),可是當數組有序時,能夠採用折半查找將時間複雜度降爲O(logn);
六、插入和刪除時,數組平均須要移動n/2個元素,而鏈表只需修改指針便可;
七、空間分配方面:
數組在靜態存儲分配情形下,存儲元素數量受限制,動態存儲分配情形下,雖然存儲空間能夠擴充,但須要移動大量元素,致使操做效率下降,並且若是內存中沒有更大塊連續存儲空間將致使分配失敗;
鏈表存儲的節點空間只在須要的時候申請分配,只要內存中有空間就能夠分配,操做比較靈活高效;
8.經典數據結構涵蓋了多種抽象數據類型(ADT),其中包括棧、隊列、有序列表、排序表、哈希表及分散表、樹、優先隊列、集合和圖等。對於每種狀況,均可以選用數組或某一種鏈表數據結構來實現其抽象數據類型(ADT)。因爲數組和鏈表幾乎是創建全部ADT的基礎,因此稱數組與鏈表爲基本數據結構