漫畫演算法 學習筆記(03)

2021-10-20 03:18:01 字數 2979 閱讀 5675

3. **實現

4. 陣列與鍊錶的比較

鍊錶(linked list):是一種在物理上非連續非順序的資料結構,由若干節點(node)所組成。

private

static

class

node

鍊錶的第乙個節點被稱為頭節點,最後乙個節點被稱為尾節點,尾節點的next指標指向null。對於鍊錶的其中乙個節點a,我們只能根據節點a的next指標來找到該節點的下乙個節點b,再根據節點b的next指標找到下乙個節點c,依次單線傳遞。

什麼是雙向鍊錶?

雙向鍊錶:比單向鍊錶稍微複雜一點,它的每乙個節點除了擁有data和next指標外,還擁有指向前置節點的prev指標。

鍊錶的儲存方式

如果說陣列在記憶體中的儲存方式是順序儲存,那麼鍊錶在記憶體中的儲存方式則是隨機儲存。 鍊錶的每乙個節點在記憶體的不同位置,依靠next指標關聯起來。這樣可以靈活有效的利用零散的碎片空間。

查詢節點

在查詢元素時,煉表不像陣列那樣可以通過下標快速進行定位,只能從頭節點開始向後乙個乙個節點逐一查詢。

鍊錶中的資料只能按順序進行訪問,最壞的時間複雜度為o(n)。

更新節點

如果不考慮查詢節點的過程,鍊錶的更新過程會像陣列那樣簡單,直接把舊資料換成新資料即可。

插入節點

與陣列類似,鍊錶插入節點時,同樣分三種情況:

尾部插入:是最簡單的情況,把最後的乙個節點的next指標指向新插入的節點即可。

頭部插入:第一步:把新節點的next指標指向原先的頭節點;第二步:把新節點變為鍊錶的頭節點。

中間插入:可以分為兩個步驟完成:第一步:新節點的next指標,指向插入位置的節點。第二步:插入位置前置節點的next指標,指向新節點。

只要記憶體空間允許,能夠插入鍊錶的元素時無窮無盡的,不需要像陣列那樣考慮擴容的問題。

刪除節點

鍊錶的刪除操作同樣分為三種情況。

尾部刪除:是最簡單的情況,把倒數第二個節點的next指標指向null即可。

頭部刪除:也比較簡單,把鍊錶的頭節點設為原先頭節點 的next指標即可。

如果不考慮插入、刪除操作之前查詢元素的過程,只考慮純粹的插入和刪除操作,鍊錶的插入、刪除操作時間複雜度都為o(1).

實現鍊錶的完整**

// 頭節點指標

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

以上是對單鏈表相關操作的**實現。為了尾部插入的方便,**中額外增加了指向鍊錶尾部節點的指標last。

查詢更新

插入刪除

陣列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 出入元素是在不同的兩端 隊頭和隊尾 由於我們可以使用兩個棧,那麼可以讓其中乙個棧作為佇列的入口,負責插入新元素 另乙個棧作為佇列的出口,...