103 scala 鍊錶之單向雙向

2021-10-07 19:44:11 字數 3486 閱讀 9225

一、什麼是鍊錶

鍊錶是有序的列表,但是它在記憶體中是儲存如下:

總結

鍊錶是乙個有序列表

鍊錶的資料,在記憶體空間不一定是連續分布的

鍊錶又分單向、雙向或者迴圈

區別:

1、單向鍊錶

2、雙向鍊錶

3、迴圈鍊錶(單向迴圈,雙向迴圈)

如下圖

使用場景及優缺點:

單向鍊錶:

1、單向鍊錶需要實現佇列,建設頭結點是尾部,入隊速度快,但是每次出隊需要遍歷到最後乙個節點

2、實現棧則比較完美

3、鍊錶移除資料需要臨時節點來記錄待刪除節點的前乙個節點

雙向鍊錶:

1、頭尾節點都有並且是雙向,則實現佇列不用遍歷資料,頭尾一出一進,完美配合

2、刪除資料時不需要臨時節點,只需將刪除節點的前乙個節點的向後指向刪除節點的後乙個,刪除節點的後乙個節點指向前乙個節點即可

迴圈鍊錶:解決特殊的演算法問題,後續案例介紹

二、**實操

1、單向鍊錶**

object danxlink 

}/**

* 單向鍊錶只能從前頭結點向後查詢

* head-->1-->2-->3-->4-->null

*/class

danxlink

//末尾新增

def addlastnode

(value: int)

: unit =

/** * 插入結點

** @param value 結點值

* @param index 座標

* @param len 當前所在深度

* @param cur 當前所在節點

*/def add

(value: int, index: int, len: int, cur: node)

: unit =

if(index == len)

else

}/**

* 根據座標查詢資料

** @param index

* @return

*/def get

(index: int)

: int =

/** * 根據座標查詢資料

** @param index 座標

* @param len 當前深度

* @param cur 當前節點

* @return

*/def get

(index: int, len: int, cur: node)

: int =

if(index == len)

else

}/**

* 根據座標刪除節點

* @param index

* @return

*/def remove

(index: int)

: int =

/** * 根據座標刪除節點

* @param index 座標

* @param len 深度

* @param cur 當前節點

* @return 刪除值

*/def remove

(index: int, len: int, cur: node)

: int =

//待刪除節點位置

if(index == len)

else

} def size()

= def isempty()

= def showdata()

: unit =}}

class

node

2、雙向鍊錶**
object shuangxlink

}/**

* * 雙向鍊錶:需要頭尾節點,並且可以從尾部向頭結點查詢

* head 1 4 tail

* * 優點:使用雙向鍊錶來完成棧、佇列,則從頭尾節點來操作,省略遍歷鍊錶的時間了

*/class

shuangxlink

//末尾新增

def addlastnode

(value: int)

: unit =

/** * 插入結點

** @param value 結點值

* @param index 座標

* @param len 當前所在深度

* @param cur 當前所在節點

*/def add

(value: int, index: int, len: int, cur: node)

: unit =

if(index == len)

else

}/**

* 根據座標查詢資料

** @param index

* @return

*/def get

(index: int)

: int =

/** * 根據座標查詢資料

** @param index 座標

* @param len 當前深度

* @param cur 當前節點

* @return

*/def get

(index: int, len: int, cur: node)

: int =

if(index == len)

else

}/**

* 根據座標刪除節點

* @param index

* @return

*/def remove

(index: int)

: int =

/** * 根據座標刪除節點

* @param index 座標

* @param len 深度

* @param cur 當前節點

* @return 刪除值

*/def remove

(index: int, len: int, cur: node)

: int =

//待刪除節點位置

if(index == len)

else

} def size()

= def isempty()

= def showdata()

: unit =

}}

單向鍊錶和雙向鍊錶區別 雙向鍊錶

一開始確實被這個雙向鍊錶整暈了,node裡面不停套node,簡直無限套娃,讓人不知道該怎麼下手。後來看了資料結構與演算法分析這本書的 才算整明白。我把鍊錶分成了三個部分 第一部分是node.node是乙個由兩根指標,以及我們需要儲存的資料構成的結構體。這個node就是無限套娃的起源,也是鍊錶用於儲存...

單向鍊錶he雙向鍊錶

鍊錶 linked list 是一種常見的基礎資料結構,是一種線性表,但是並不會按線性的順序儲存資料,而是在每乙個節點裡存到下乙個節點的指標 pointer 在電腦科學中,鍊錶作為一種基礎的資料結構可以用來生成其它型別的資料結構。鍊錶通常由一連串節點組成,每個節點包含任意的例項資料 data fie...

單向鍊錶和雙向鍊錶

1.單向鍊錶 單向鍊錶只可向乙個方向遍歷。查詢乙個節點的時候需要從第乙個節點開始每次訪問下乙個節點,一直訪問到需要的位置。也可以提前把乙個節點的位置另外儲存起來,然後直接訪問。2.雙向鍊錶 可以從任何乙個節點訪問前乙個節點,也可以訪問後乙個節點,以至整個鍊錶。一般是在需要大批量的另外儲存資料在鍊錶中...