一、什麼是鍊錶
鍊錶是有序的列表,但是它在記憶體中是儲存如下:
總結:
鍊錶是乙個有序列表
鍊錶的資料,在記憶體空間不一定是連續分布的
鍊錶又分單向、雙向或者迴圈
區別:
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.雙向鍊錶 可以從任何乙個節點訪問前乙個節點,也可以訪問後乙個節點,以至整個鍊錶。一般是在需要大批量的另外儲存資料在鍊錶中...