8.1.陣列存在的問題在處理列表的時候陣列是常用的資料結構。陣列可以對所儲存的資料項提供快速地訪問訪問,而且它很易於進行迴圈遍歷操作。當然,陣列已經是語言的一部分了,使用者不需要使用額外的記憶體,也不需要花費因使用使用者自定義的資料結構所需的處理時間。
然而正如所見,陣列不是一種最佳的資料結構。在無序陣列中查詢乙個資料項是很慢的,這是因為在找到要查詢的元素之前需要盡可能地訪問到陣列內的每乙個元素。有序(排序)陣列對查詢而言會更加高效一些,但是插入和刪除操作還是很慢的,因為需要向前或向後移動元素來為插入留出空間,或者為刪除移除空間。更別提在有序陣列內還需要為插入元素查詢到合適的位置了。
8.2.定義鍊錶是被稱為節點的類物件的群集。每乙個節點通過乙個引用鏈結到列表內的後繼節點上。節點包括儲存資料的字段和節點引用的字段。到另外乙個節點的引用被稱為是鏈結。
陣列:元素是通過位置(索引)進行引用大家會說「 bread」跟在「 milk」的後面,而不會說「 bread」是在第二個位置上。遍歷鍊錶是從鍊錶的起始節點一直到末尾節點。鍊錶:元素是通過它們與陣列其他元素的關係進行引用
還需要注意的一點就是對鍊錶結尾的標記是通過指向空( null)值實現的。既然是在記憶體中處理類物件,所以就用空( null)物件來表示列表的末尾。
在許多鍊錶的實現中通常會包含乙個被稱為「頭節點」的特殊節點來作為鍊錶的起始位置。
插入操作成為一種非常有效的工作。所要做的就是
1.把要插入節點之前節點的鏈結改為指向要插入的節點,
2.並且把新節點的鏈結設為指向插入之前前節點所指向的節點。
把資料項「 cookies」新增到鍊錶內「 eggs」的後面
從鍊錶中移除資料項也是如此容易。
1.就是簡單地把要刪除節點之前節點的鏈結重定向到刪除節點所指向的節點,
2.並且把刪除節點的鏈結設為空( null)就可以了
8.3 物件導向鍊錶的設計
鍊錶的設計至少包含兩個類。
這裡會建立乙個 node 類,而且每次向鍊錶新增節點的時候會例項化乙個 node物件。
鍊錶內的節點通過索引與其他節點相互連線在一起。而且把這些索引設定為使用建立在乙個獨立的 linkedlist類中的方法。
8.3.1.node類
為了完成 node 類的定義,至少需要兩種構造器方法。明確地需要乙個預設的構造器來建立乙個空的 node,其中的 element 和 link 都設為空( null)。
還需要乙個引數化的構造器用來給成員 element 賦值資料,並且把成員 link設定為空( null)。
public8.3.2 linkedlist類class
node
public
node(object theelement)
}
linkedlist 類用來建立鍊錶中節點之間的鏈結。
需要一種構造器方法來例項化煉表。
此類中唯一的資料成員就是頭節點。
public class頭節點從其 link 字段設定為空( null)開始。當把第乙個節點新增到鍊錶中的時候,會把頭節點的 link 字段設定成指向新的節點,並且把新節點的 link 字段設定為空( null)。linkedlist
}
8.4鍊錶設計的改進方案
8.4.1雙向鍊錶
8.4.2迴圈鍊錶
8.5.使用iterator類
linkedlist 類存在的乙個問題就是不能在鍊錶內同時引用兩個位置。大家可以引用鍊錶內的任何乙個位置(當前節點、前乙個節點等等),但是如果想指定兩個甚至更多個位置,比如想從鍊錶中移除一段範圍內的節點,就需要一些其他方法了。這種方法就是 iterator 類。
資料結構和演算法 雙向鍊錶
初始化 指標域置為空 null 資料域可用可不用 前插法 插入節點插在頭節點之後 為前插法 插入節點的next 頭節點的next 插入節點的prev 頭節點 頭節點的next 插入節點 判斷是否存在下乙個節點 如果 頭節點的next null 說明存在,就需要把下乙個節點的prev指向插入節點 如果...
資料結構與演算法 鍊錶 雙向鍊錶和環形鍊錶
1 雙向鍊錶和單向鍊錶之間有什麼區別?答 雙向鍊錶和單向鍊錶之間最大的區別就是其多了乙個指向前乙個節點的指標域。2 雙向鍊錶對比於單鏈表有什麼優點?答 3 雙向鍊錶功能實現時和單向鍊錶有何區別?答 具體功能實現大體上沒有區別,在遍歷節點和修改節點兩個功能上只需要將節點修改為雙向節點,根本不需要進行其...
資料結構和演算法 旋轉列印鍊錶
輸入引數 n n 為正整數,如輸入n 5 role presentation style position relative n 5 n 5,則按行列印如下的數字 這個問題是將數字1 n21 n 2按照一圈一圈的方式儲存好,再按照行的方式對其進行列印。最簡單的方法是利用陣列 這個方法比較簡單,就不給...