首先來說乙個問題,線性表和鍊錶的區別。
線性表是n個資料元素的有限序列,複雜的線性表中,資料元素可以有若干個資料項構成乙個記錄。線性表可以有兩種表示方式,順序表示和鏈式表示。線性表的順序表示是用一組連續的記憶體儲存線性表的資料元素。而線性表的鏈式表示是用隨機的儲存單元來儲存線性表的元素,這種線性表就是鍊錶。鍊錶的結點包含兩個域,儲存資料元素資訊的資料域和儲存直接後繼儲存位置的指標域。順序表示和鏈式表示各有優點,他們的區別類似於模板庫里的vector和list。順序表示可以順序儲存,因此它可以輕鬆的訪問第i個資料元素和求出表的長度,但是插入和刪除卻很麻煩,因為除了結尾其餘位置的插入和刪除都必須移動一部分元素。插入和刪除的時間複雜度是o(n)。而鍊錶由於其隨機儲存的結構,可以方便的插入和刪除,但是求鍊錶的長度,就必須遍歷整個鍊錶。鍊錶只儲存頭結點的資訊,這個鍊錶占用的空間不需要預先分配劃定,可以根據需求隨時生成,因此鍊錶是一種動態結構。
今天的鍊錶我就不做過多總結,原因是鍊錶是c語言裡的結構,在c++裡鍊錶可以用vector和list實現,基本操作都可以很方便的實現。指標也是c語言裡的重點,c++用了更安全的引用和迭代器來代替指標的功能。但這不代表鍊錶這種資料結構不重要,而是我們有更好的方法來表達和使用鍊錶。而我這個資料結構系列的部落格是對我之前寫的劍指offer系列部落格中所用到的資料結構的總結。而劍指offer中的鍊錶大多是用指標做的,因此這裡就不做過多討論了。
還有,c語言中的功能用函式和結構體實現,而在c++中使用了更安全和物件導向的類實現。因此c++中要多使用具有物件導向特徵的類來實現功能,模擬普通的函式更安全,更容易擴充套件和維護。
還有乙個問題是vector和list的區別。
1. 總體來講:vector是可變大小的陣列,存放在一段連續的記憶體上;而list是雙向鍊錶,邏輯上相鄰的元素其物理記憶體可能相鄰也可能不相鄰。它們都是順序容器。
2. 訪問:vector支援快速隨機訪問,而list只支援雙向順序訪問。
3. 插入與刪除元素:vector除了尾部之外的位置插入或刪除很慢,單list在任何位置插入刪除都很快。
4.記憶體:由於涉及額外指標的維護,list的額外記憶體開銷更大。
5.迭代器型別不同:vector提供隨機迭代器(random_access_iterator
),list提供的是雙向迭代器(bidirectional_iterator
)。區別是隨機迭代器可以支援下標操作,雙向迭代去可以支援雙向的指標操作。
5,13,26-27,37,56-57
快慢指標
鍊錶的遍歷,從前都後,從後向前(逆序輸出)
插入,刪除。查詢(o(1))
兩個有序鍊錶的合併,有共同鍊錶結點查詢
存在環的鍊錶如何查詢環,環的長度。雙向鍊錶。
資料結構 2 鍊錶
填補那些模稜兩可的後知後覺 public class linkedlist public node e e public node override public string tostring private node dummyhead 虛擬頭節點 private int size 元素個數 p...
資料結構2迴圈鍊錶
尾結點指向頭結點的單鏈表。解決了單鏈表無法查詢某一結點的問題。結點定義方式 define maxsize 20 定義陣列的最大長度 typedef struct clinklist mode 類似單鏈表。迴圈鍊錶的初始化 初始化迴圈鍊錶 void ds init mode pnode pnode 指...
資料結構之鍊錶2
繼上文 資料結構之鍊錶1之後,本文將繼續講解鍊錶。迴圈單鏈表是另一種形式的單鏈表。它的特點是表中的最後乙個結點的指標域指向頭結點,整個鍊錶形成乙個環。因此,從迴圈單鏈表中任一結點出發均可找到表中其他結點,如下圖。類似的,還可以有多重鏈的迴圈鍊錶。迴圈單鏈表的底層實現 迴圈單鏈表的操作與單鏈表的實現基...