3. **實現
4. 陣列與鍊錶的比較
鍊錶(linked list):是一種在物理上非連續、非順序的資料結構,由若干節點(node)所組成。
鍊錶的第乙個節點被稱為頭節點,最後乙個節點被稱為尾節點,尾節點的next指標指向null。對於鍊錶的其中乙個節點a,我們只能根據節點a的next指標來找到該節點的下乙個節點b,再根據節點b的next指標找到下乙個節點c,依次單線傳遞。private
static
class
node
什麼是雙向鍊錶?
雙向鍊錶:比單向鍊錶稍微複雜一點,它的每乙個節點除了擁有data和next指標外,還擁有指向前置節點的prev指標。
鍊錶的儲存方式
如果說陣列在記憶體中的儲存方式是順序儲存,那麼鍊錶在記憶體中的儲存方式則是隨機儲存。 鍊錶的每乙個節點在記憶體的不同位置,依靠next指標關聯起來。這樣可以靈活有效的利用零散的碎片空間。
查詢節點
在查詢元素時,煉表不像陣列那樣可以通過下標快速進行定位,只能從頭節點開始向後乙個乙個節點逐一查詢。
鍊錶中的資料只能按順序進行訪問,最壞的時間複雜度為o(n)。
更新節點
如果不考慮查詢節點的過程,鍊錶的更新過程會像陣列那樣簡單,直接把舊資料換成新資料即可。
插入節點
與陣列類似,鍊錶插入節點時,同樣分三種情況:
尾部插入:是最簡單的情況,把最後的乙個節點的next指標指向新插入的節點即可。
頭部插入:第一步:把新節點的next指標指向原先的頭節點;第二步:把新節點變為鍊錶的頭節點。
中間插入:可以分為兩個步驟完成:第一步:新節點的next指標,指向插入位置的節點。第二步:插入位置前置節點的next指標,指向新節點。
只要記憶體空間允許,能夠插入鍊錶的元素時無窮無盡的,不需要像陣列那樣考慮擴容的問題。
刪除節點
鍊錶的刪除操作同樣分為三種情況。
尾部刪除:是最簡單的情況,把倒數第二個節點的next指標指向null即可。
頭部刪除:也比較簡單,把鍊錶的頭節點設為原先頭節點 的next指標即可。
如果不考慮插入、刪除操作之前查詢元素的過程,只考慮純粹的插入和刪除操作,鍊錶的插入、刪除操作時間複雜度都為o(1).
實現鍊錶的完整**
以上是對單鏈表相關操作的**實現。為了尾部插入的方便,**中額外增加了指向鍊錶尾部節點的指標last。// 頭節點指標
private node head;
// 尾節點指標
private node last;
// 鍊錶實際長度
private
int size;
/*** 鍊錶插入元素
* param data 插入元素
* param index 插入位置
*/public
void
insert
(int data,
int index)
throws exception
node insertnode =
newnode
(data);if
(size ==0)
else
if(index ==0)
else
if(size ==index)
else
size++;}
/*** 鍊錶刪除元素
* param index 刪除的位置**/
public node remove
(int index )
throws exception
node removednode =null;
if(index ==0)
else
if(index ==size-1)
else
size--
;return removednode;
}/**
* 鍊錶查詢元素
* param index 查詢的位置
*/public node get
(int index)
throws exception
node temp =head;
for(int i=
0;i)return temp;
}/**
* 輸出鍊錶
*/public
void
output()
}/**
* 鍊錶節點
*/private
static
class
node
}public
static
void
main
(strings[
] args)
throws exception
查詢更新
插入刪除
陣列o(1)
o(1)
o(n)
o(n)
鍊錶o(n)
o(1)
o(1)
o(1)
從**可以看出,陣列的優勢在於能夠快速定位元素,對於讀操作多,寫操作少的場景來說,用陣列更合適一些。
鍊錶的優勢在於能夠靈活的進行插入和刪除操作,如果需要在尾部頻繁插入、刪除元素,用鍊錶更合適一些。
漫畫演算法 學習筆記01
在計算機領域裡,演算法是一系列程式指令,用於處理特定的運算和邏輯問題。衡量演算法優劣的主要標準是時間複雜度和空間複雜度。資料結構是資料的組織 管理和儲存格式,其使用目的是為了高效的訪問和修改資料。資料結構包含陣列 鍊錶這樣的線性資料結構,也包含樹 圖這樣的複雜資料結構。資料結構 data struc...
漫畫演算法 學習筆記(11)
2.二叉堆堆自我調整 3.二叉堆的 實現 二叉堆 本質上是一種完全二叉樹,它分兩個型別。什麼是最大堆?最大堆 最大堆的任何乙個父節點的值,都大於或等於它左 右孩子節點的值。什麼是最小堆?最小堆 最小堆的任何乙個父節點的值,都小於或等於它左 右孩子節點的值。二叉堆的根節點叫作堆頂。最大堆和最小堆堆特點...
漫畫演算法 學習筆記(23)
q 用兩個棧來模擬乙個佇列,要求實現佇列的兩個基本操作,入隊和出隊。思路 棧的特點是先入後出 filo 出入元素都是在同一端 棧頂 佇列的特點是先入先出 fifo 出入元素是在不同的兩端 隊頭和隊尾 由於我們可以使用兩個棧,那麼可以讓其中乙個棧作為佇列的入口,負責插入新元素 另乙個棧作為佇列的出口,...