順序表、單鏈表、雙鏈表、循環鏈表、有序表

順序表

在Java中線性表的順序表的存儲結構是利用數組來實現的,存儲空間是連續的。存儲空間的起始位置就是由數組名錶示的地址常量。

實例

ArrayList也是用數組實現的,其內部維護了一個數組,是一種可變長度的數組。

數組在創建時其存儲空間就已經固定,爲了解決這個問題,ArrayList會先創建一個數組,當向尾部添加元素時,會先檢查數組長度是否夠用,如果夠用就把數據加到數組中,如果不夠用會創建新的數組,將原數組中元素一個個複製到新數組後,將新元素添加進來。如果向頭部或者中間插入元素會直接導致數據移動。

在ArrayList中,相鄰的元素其存儲位置也相鄰,在進行插入或刪除操作時,平均需要移動半個表的元素,時間複雜度爲O(n),但是其在進行查找時可以其時間複雜度爲O(1),所以一般用於查找比較多的場景中。

鏈表

在鏈式存儲中,每個存儲結點不僅包含元素本身的信息(數據域),還包含了下一個(雙鏈表中還有上一個)元素的地址信息(指針域)。

在鏈表中存儲空間不要求一定是連續的,每個結點存儲位置可以任意安排,所以在執行插入或刪除操作時只需要修改相關結點的指針域即可。

鏈表比順序表更適合插入和刪除操作。

單鏈表

單鏈表:在每個結點中除包含數據域外,還設置一個指針域用以指向其後繼結點,這種構成的鏈接表稱爲線性單向鏈接表,簡稱單鏈表。

單鏈表中當訪問一個結點後,只能訪問其後繼結點,而無法訪問其前驅結點。

當單鏈表在執行插入時,比如要在a結點前插入一個結點,那麼就要修改a結點的前驅結點的指針域,但是因爲通過結點不能找到其前驅結點,所以需要從表頭遍歷至前驅結點然後進行插入操作,這樣時間複雜度就是O(n)。雖然單鏈表和順序表在執行插入時時間複雜度都是O(n),但是順序表還要執行移動結點的操作而鏈表卻不用移動結點,該操作通常要比單純的查找更加費時。所以單鏈表的插入比順序表的插入要高效。

當單鏈表執行刪除操作時時間複雜度是O(1) 比順序表的刪除操作要高效。

當單鏈表執行查找操作時要從表頭開始遍歷,時間複雜度是O(n) 比順序表的查找操作要低效。

雙鏈表

雙鏈表:在每個結點中除包含數據域外,還設置個兩個指針域,一個用以指向其後繼結點,一個用以指向其前驅繼結點,這種構成的鏈接表稱爲線性雙向鏈接表,簡稱雙鏈表。

雙鏈表可以訪問其後繼結點及其前驅結點,這樣就可以從兩端訪問所有結點,並且對於插入操作中查找前驅結點的問題,在雙鏈表中是不存在的。

在雙鏈表中結點的插入和刪除操作涉及前後結點的兩個指針域的變化。java中LinkedList正是對雙鏈表的實現。

雙鏈表的插入和刪除操作時間複雜度是O(1)。

雙單鏈表執行查找操作時會從離的較近的表頭開始遍歷,時間複雜度是O(n) 比順序表的查找操作要低效。

循環鏈表

循環鏈表也是鏈式存儲結構,它的尾結點的指針域指向頭結點,如果是雙向鏈表其頭結點指向前驅結點的指針會指向尾結點,這樣整個鏈表形成一個環。從表中任意一結點出發均可找到鏈表中其他結點。

有序表

有序表:按照結點元素的值以遞增或遞減方式排列,並且要求有序表中不存在元素值相同的結點。

有序表可以採用順序表和鏈表進行存儲。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章