本人非常感謝!希望能和您共同學習,共同進步!
下面介紹鍊錶的兩種結構:
單向鍊錶:只能從頭遍歷到尾,或者從尾遍歷到頭。
圖例:
ele:每個節點中的元素。
first:指頭部,鍊錶中第乙個元素。
我們可以理解為,當拿到鍊錶物件,呼叫first()就可以得到第乙個元素。
size:指元素的個數。(或鍊錶的長度-1,索引從0開始),在集合中沒有length一說。陣列中的length相當於集合框架中的size
模擬**為:
//單向鍊錶
class node
}
雙向鍊錶:可以從頭遍歷到尾,也可以從尾遍歷到頭。我們可以理解為,雙向鍊錶其實就是兩個單向鍊錶的合成。只不過是乙個從頭到尾,乙個從尾到頭。圖例:
node first:拿到第乙個節點
node last:拿到最後乙個節點。
模擬**:
//模擬雙向鍊錶**
class node
}
基於鍊錶的實現**:
//基於雙向鍊錶的集合
/***具體操作**請參見linkedlist原始碼
*這裡不作具體實現
*/pub11c class mylinkedl1st
}
總結:對於鍊錶操作,無疑是雙向鍊錶功能更強大。而雙向鍊錶在取頭和尾的時候速度更快。
對於鍊錶linkedlist的具體實現,我們仔細讀原始碼可以得出:
在刪除操作上,鍊錶結構相對於陣列結構要更快。
為什麼呢?
陣列每次進行刪除操作都要進行移位與遍歷。當某個元素被刪除時,後面的元素要向前補位。最後乙個元素設為null,
然後再刪除最後乙個元素所佔的記憶體空間。
鍊錶的刪除操作演算法分析:
刪除(first也可當做current)即第乙個節點時,把下乙個節點的next賦給第乙個節點的next。把第乙個節點的prev設為null;
刪除最後乙個節點時,把最後乙個節點的prev賦給當前物件的last,再把current節點的上乙個(prev)節點的next設為null;
刪除中間(此處中間節點指將要被刪除的節點current)節點時,把current節點的next賦給current節點的上乙個節點的next。
再把current節點的prev賦給current節點的下乙個節點的prev。
下面給出具體實現**:
前文說過,linkedlist在向頭和尾新增元素時,效能更優。下面給出具體實現**及**分析:
在向頭部新增元素時演算法實現:
把新增之前第乙個節點設為新增節點的next節點,然後把新增節點作為之前第乙個節點的上乙個節點。(或換種說法:把之前第乙個節點的上乙個節點作為新增節點),再把新增節點作為第乙個節點。而新增節點的prev最好設定為null
向尾部新增元素演算法實現:
把新增節點作為之前最後乙個節點的next節點,再把之前最後乙個節點作為新增節點的上乙個節點。
再把物件的last屬性設定為新增節點即可。
1):增操作:
雙向鍊錶可以直接獲取自己的第乙個和最後一乙個節點,
如果新增的元素在第乙個或最後一 個位置,那麼操作只有1次.
2):刪除操作(removefisrt,removelast):
如果刪除第乙個元素:操作一一次.如果操作最後乙個元素:操作一次如果刪除中間的元素:
找到元素節點平均操作:(1+n)/2次.找到節點之後做刪除操作: 1次
3):查詢操作:
平均:(n+1)/2次
4):修改操作:
平均:(n+1)/2+1次
基於前文(arraylist效能分析),我們可以得出arraylist和linkedlist的各自優異之處。
基於陣列的列表和基於鍊錶的列表的效能對比:
arraylist:查詢,更改較快,新增和刪除較慢
linkeduist查詢更改較慢,新增和刪除較快
資料結構 鍊錶
鍊錶 what 就是一張鏈式儲存的表,是一種資料結構,是基礎,所以還是不要想有什麼用。具體呢?在c中就用結構體實現物件描述,然後通過函式來實現各個基本操作 c 則用類來表述,c中的結構體就可以看成c 中的類,然後通過類封裝各個操作步驟。這些操作實現後就需要 來測試,號稱demo,就是main函式裡面...
資料結構 鍊錶
鍊錶中的資料是以節點來表示的,每個結點的構成 元素 資料元素的映象 指標 指示後繼元素儲存位置 元素就是儲存資料的儲存單元,指標就是連線每個結點的位址資料。鍊錶的結點結構 data next data域 存放結點值的資料域 next域 存放結點的直接後繼的位址 位置 的指標域 鏈域 以 結點的序列 ...
資料結構 鍊錶
一般的建立線性鍊錶有兩種 1.正序法 需要三個指標,head作為頭指標,pre作為前乙個指標,cur作為當前指標用來建立空間 2.倒序法,利用指標的插入,只需要兩個指標,不斷的往頭指標後插入新空間,不過插入的越早,離頭指標越遠,也就越後面輸出 1.線性鍊錶的建立及查詢刪除 include inclu...