讀《Java數據結構和算法》(第五章)

讀《Java數據結構和算法》(第五章)

一、第五章5.1

1、鏈表
(1)鏈結點Link
在鏈表中,每個數據項都包含在Link中,每個Link對象中都包含一個對下一個鏈結點引用的字段(next)
(2)一個引用是一個對某個對象的參照數值,是一個計算機內存中的對象地址
(3)鏈表表示不能訪問到數據項,必須使用數組之間的關係來定位

2、單鏈表
(1)在鏈表頭插入一個數據項
(2)在鏈表頭刪除一個數據項
(3)遍歷鏈表顯示內容

3、LinkList類
(1)只包含一個數據項,即對鏈表中第一個鏈結點的引用,first
(2)第一個鏈結點是唯一的鏈表需要維護的永久信息,用於定位所有其他的鏈結點

4、雙端鏈表
(1)對最後一個鏈結點的引用,就像是對第一個鏈結點的引用
(2)對最後一個鏈結點的引用允許像在表頭一樣,在表尾直接插入一個鏈結點
(3)雙端鏈表FirstLastList有兩個項first和last,一個指向鏈表中的第一個鏈結點,另一個指向最後一個鏈結點,如果鏈表中只有一個鏈結點,first和last就都指向它,如果沒有鏈結點,兩者都爲null值

5、鏈表的效率
(1)在表頭插入和刪除速度很快,僅需要改變一兩個引用值,花費O(1)的時間
(2)平均查找、刪除和在指定鏈結點後插入,都需要搜索鏈表中的一半鏈結點,需要O(N)次比較
(3)鏈表比數組快,因爲插入和刪除鏈結點時,鏈表不需要移動任何東西
(4)鏈表需要多少內存就可以用多少內存,並且可以擴展到所有可用內存
(5)數組的大小在創建的時候就固定了,數組太大導致效率低下,數組太小導致空間溢出
(6)向量是一種可擴展的數組,可以通過可變長度解決這個問題,但是經常只允許以固定大小的增量擴展,但在內存使用效率上還是要比鏈表的低

二、第五章5.2

1、有序鏈表
(1)有序鏈表的刪除常常只限於刪除在鏈表頭部的最大或最小的鏈結點
(2)效率
在有序鏈表插入和刪除某一項最多需要O(N)次比較(平均N/2),因爲沿着鏈表一步一步走才能找到正確的位置
(3)在有序鏈表中每插入一個新的鏈結點,平均要與一般已存在數據及逆行比較,如果插入N個新數據就要進行N*N/4次比較
(4)每一個鏈結點只進行了兩次複製:一次從數組到鏈表,一次從鏈表到數組
(5)與基於數組的插入排序相比,表插入排序有一個缺點,就是它要開闢差不多兩倍的空間

2、雙向鏈表
(1)允許向前遍歷,也允許向後遍歷整個鏈表
(2)每個鏈結點有兩個指向其他鏈結點的引用,而不是一個
(3)第一個像普通鏈表一樣指向下一個鏈結點,第二個指向前一個鏈結點
(4)雙向鏈表的缺點是每次插入或者刪除一個鏈結點的時候,要處理四個鏈結點的引用,而不是兩個:兩個連接前一個鏈結點,兩個連接後一個鏈結點

3、迭代器
(1)迭代器類包含對數據結構中數據項的引用,並遍歷這些結構的對象
(2)創建迭代器對象後,可以通過它存取它指向的鏈結點,或遞增它以指向下一個鏈結點
(3)迭代器總是指向鏈表中的一些鏈結點,同鏈表相關聯,但並不等同於鏈表或者鏈結點,顯示了指向鏈表中的鏈結點的兩個迭代器
(4)迭代器方法

reset():把迭代器設在表頭
nextLink():把迭代器移動到下一個鏈結點
getCurrent():返回迭代器指向的鏈結點
atEnd():如果迭代器到達表尾,返回true
insertAfter():在迭代器後面插入一個新鏈結點
insertBefore():在迭代器前面插入一個新鏈結點
deleteCurrent():刪除迭代器所指鏈結點

三、總結

1、每個Link對象包含數據和一個引用,通常叫做next,指向鏈表的下一個鏈結點
2、next字段爲null值意味着鏈表的結尾
3、在表頭插入鏈結點需要把新鏈結點的next字段指向原來的第一個鏈結點,然後把first指向新鏈結點
4、在表頭刪除鏈結點要把first指向first.next
5、爲了遍歷鏈表,從first開始,然後從一個鏈結點到下一個鏈結點,方法就是用每個鏈結點的next字段找到下一個鏈結點
6、雙端鏈表在鏈表中維護一個指向最後一個鏈結點的引用,它通常和first一樣,叫做last,雙端鏈表允許在表尾插入數據項
7、棧和隊列都是ADT,既可以用數組實現,又可以用鏈表實現
8、在有序鏈表中插入需要O(N)的時間,因爲必須找到正確的插入點,最小值鏈結點的刪除需要O(1)時間
9、迭代器其是一個引用,被封裝在類對象中,這個引用指向相關聯的鏈表中的鏈結點
10、迭代器方法允許使用者沿鏈表移動迭代器,並訪問當前指示的鏈結點
11、能用迭代器遍歷鏈表,在選定的鏈結點(或者所有鏈結點)上執行某些操作

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