資料結構專題 線性表之單鏈表及其Java實現

2021-08-10 03:06:47 字數 2006 閱讀 5650

儘管我們在遇到頻繁訪問列表中元素時,arraylist是乙個很好的選擇;但當我們需要頻繁新增、刪除列表中元素,尤其是在表的前端進行增刪操作時,arraylist就不是乙個特別好的選擇了。

為了解決新增、刪除元素時需要大量其它元素移動的問題,我們今天一起來接觸在記憶體中鏈式儲存的線性表(也稱為鍊錶)。

鏈式儲存的線性表同樣需要一組儲存單元去儲存資料元素,但是這組儲存單元可以是記憶體上連續的,也可以是記憶體上不連續的

對於順序儲存的線性表來說,每個儲存單元只需要儲存資料元素即可,因為它們在記憶體上是連續的,第乙個資料元素所佔的記憶體空間之後,一定是下乙個資料元素。

因此,對於每乙個資料元素ai來說,除了儲存其本身的資料資訊之外,還需要儲存乙個指示其直接後繼元素的記憶體位置。我們把儲存資料元素資訊的域稱為資料域,把儲存直接後繼元素位置的域稱為指標域。這兩部分資訊組成資料元素ai的儲存映像,稱為節點(node)。n個節點連線成乙個鍊錶(a1,a2, … ,an),因為這個鍊錶的每個節點中只包含乙個指標域(指向它的直接後繼元素),所以這種鍊錶也成為單鏈表。

public

class

mysinglylinkedlist

implements

mylist

//內部類node,用來表示單鏈表中每乙個資料元素

class node

}

@override

public

intsize()

@override

public

boolean

isempty()

@override

public

boolean

add(e e)

@override

public

void

add(int index, e element)

//私有方法getprevnodebyindex獲取index前乙個位置的節點

private node getprevnodebyindex(int index)

@override

public

boolean

remove(object o)

}return

false;

}else

}return

false;}}

@override

public e remove(int index)

@override

public e get(int index)

@override

public e set(int index, e element)

@override

public

boolean

contains(object o)

}return

false;

}else

}return

false;}}

@override

public

void

clear()

firstnode.nextnode = null;

this.size = 0;

}

我們在這裡也分析一下mylinkedlist的特點:

我們要讀取或修改某乙個位置的節點需要花費線性時間 o(n)去遍歷列表;

我們要增加或刪除某乙個(已知位置的)節點最壞情況下要花費常數時間 o(1)

因此,當我們在遇到頻繁訪問列表中元素時,arraylist是乙個很好的選擇;但當我們需要頻繁在已知位置新增、刪除列表中元素時,linkedlist有更好的效能。

資料結構專題 線性表之單鏈表

對比了好幾本書,比較少涉及單鏈表的賦值,為了親自跑出其他功能,花了不少時間,畢竟是打基礎嘛,相信以後會越來熟練 你為什麼那麼熟練,明明是我先 話不多說,下面是 及實驗結果。include include define elementtype int define maxsize 1000 defin...

資料結構 線性表之單鏈表

線性表 亦作順序表 是最基本 最簡單 也是最常用的一種資料結構。線性表中資料元素之間的關係是一對一的關係,即除了第乙個和最後乙個資料元素之外,其它資料元素都是首尾相接的。線性表有兩種儲存結構 順序儲存結構,即儲存單元在一段連續的位址上儲存,常見的陣列就是順序儲存結構的線性表 鏈式儲存結構,即儲存單元...

資料結構專題 線性表之雙鏈表及其Java實現

這種鍊錶的缺點顯而易見,因為只能夠單向遍歷,即使我們想要訪問最後乙個元素也不得不從第乙個元素開始遍歷到最後乙個元素。為了解決這個問題,雙鏈表應運而生。和單鏈表十分相似,唯一的區別在於每個節點當中包含兩個指標域,分別指向著這個節點的前驅節點和後繼節點。因此,對於每乙個資料元素ai來說,除了儲存其本身的...