日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java数据结构和算法:线性表

發(fā)布時(shí)間:2025/4/16 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java数据结构和算法:线性表 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

線性表的定義

線性表(linear-list)是最常用最簡(jiǎn)單的一種數(shù)據(jù)結(jié)構(gòu)。一個(gè)線性表是n (n≥0)個(gè)相同類型數(shù)據(jù)元素的有限序列。記為: L= (a1, a2 , … , an )。

其中,L是表名,a1是第一個(gè)數(shù)據(jù)元素(也簡(jiǎn)稱為首元素),無(wú)前驅(qū),只有一個(gè)后繼;an是最后一個(gè)數(shù)據(jù)元素(即第n個(gè)數(shù)據(jù)元素),只有一個(gè)前驅(qū),無(wú)后繼。其余的每個(gè)數(shù)據(jù)元素ai (i=2,3, … ,n-1)都只有一個(gè)前驅(qū),且只有一個(gè)后繼。i (i=1,2, … ,n)稱為表中元素序號(hào)。n是數(shù)據(jù)元素的個(gè)數(shù),也稱為表的長(zhǎng)度,若n=0,L稱作空表。

線性表的順序表示

線性表的順序存儲(chǔ)方式是指:用一組連續(xù)的有限空間依次存儲(chǔ)線性表中的數(shù)據(jù)元素,簡(jiǎn)稱為順序表。

順序表的特點(diǎn)是:

一塊地址連續(xù)的空間存放線性表中的數(shù)據(jù)元素。任意兩個(gè)邏輯上相鄰的數(shù)據(jù)元素在物理上也必然相鄰。

順序表可以隨機(jī)訪問(wèn)。

順序表通常用數(shù)組存儲(chǔ),在C++中,數(shù)組有靜態(tài)數(shù)組和動(dòng)態(tài)數(shù)組兩種,在此我們將采用動(dòng)態(tài)數(shù)組方式存儲(chǔ)。

順序表插入、刪除算法的復(fù)雜度分析

通常順序表的插入和刪除操作都會(huì)保持各元素原來(lái)的順序不變。

舉例來(lái)看順序表上的插入和刪除。

在原來(lái)已有7個(gè)元素的表的第4個(gè)元素前插入數(shù)據(jù)元素x=24的過(guò)程。

線性表的順序存儲(chǔ)方式的缺陷

順序表是用數(shù)組方式來(lái)存儲(chǔ)的,因數(shù)組元素個(gè)數(shù)固定。當(dāng)順序表的長(zhǎng)度等于數(shù)組的元素個(gè)數(shù)時(shí),順序表就不能再插入新數(shù)據(jù)元素了。

對(duì)于有n個(gè)數(shù)據(jù)元素的順序表,若要保持各數(shù)據(jù)元素原來(lái)的順序不變,則插入和刪除一個(gè)數(shù)據(jù)元素的時(shí)間復(fù)雜度為O(n)。

順序表要求存儲(chǔ)空間是物理上連續(xù)的,這樣即使存儲(chǔ)空間中的存儲(chǔ)單位數(shù)超過(guò)所需的數(shù)目,卻因其不連續(xù),也無(wú)法使用。

克服這些缺陷的辦法是:對(duì)線性表采用鏈表存儲(chǔ)方式。

在鏈表存儲(chǔ)方式中,用戶通過(guò)new函數(shù)向系統(tǒng)動(dòng)態(tài)申請(qǐng)所需的存儲(chǔ)空間,把數(shù)據(jù)元素插入鏈表中合適的位置,而這些在不同時(shí)刻向系統(tǒng)動(dòng)態(tài)申請(qǐng)的存儲(chǔ)空間在內(nèi)存中很可能不連續(xù)。

因而,任意兩個(gè)在邏輯上相鄰的數(shù)據(jù)元素在物理上不一定相鄰,數(shù)據(jù)元素的邏輯次序是通過(guò)鏈表中的指針鏈接實(shí)現(xiàn)的。

鏈表的表長(zhǎng)是動(dòng)態(tài)的、可擴(kuò)充的,在鏈表中插入和刪除時(shí)不需移動(dòng)元素。

用鏈表存儲(chǔ)方式存儲(chǔ)線性表數(shù)據(jù)元素的方法是用結(jié)點(diǎn)(node)構(gòu)造鏈。結(jié)點(diǎn)通常有一個(gè)數(shù)據(jù)域,另外還有一個(gè)或一個(gè)以上的指針域。

鏈表存儲(chǔ)主要有單鏈、單循環(huán)鏈和雙向鏈等三種。這三種結(jié)構(gòu)中每一種又有帶頭結(jié)點(diǎn)結(jié)構(gòu)和不帶頭結(jié)點(diǎn)結(jié)構(gòu)兩種。

單鏈表

單鏈表的結(jié)構(gòu)

采用鏈接存儲(chǔ)方式存儲(chǔ)的線性表稱為線性鏈表,又稱單鏈表(linked list),或簡(jiǎn)稱為鏈表。在單鏈表中,每一個(gè)數(shù)據(jù)元素占用一個(gè)結(jié)點(diǎn)。如圖3-5所示。一個(gè)結(jié)點(diǎn)由兩個(gè)域組成,一個(gè)域存放數(shù)據(jù)元素data,一個(gè)域存放指向該鏈表中下一個(gè)結(jié)點(diǎn)的指針next,它給出下一個(gè)結(jié)點(diǎn)的開(kāi)始存儲(chǔ)地址。

在單鏈表的表尾結(jié)點(diǎn)中,指針域?yàn)榭找浴?”表示之。設(shè)線性表存有某系99級(jí)學(xué)生的學(xué)號(hào)如下:(99101,99104,99110,99201,99208),可用如圖3-6所示的單鏈表表示。

單鏈表結(jié)構(gòu)中又有帶頭結(jié)點(diǎn)和不帶頭結(jié)點(diǎn)兩種結(jié)構(gòu)。像圖3-6這樣的第一個(gè)結(jié)點(diǎn)就是數(shù)據(jù)結(jié)點(diǎn)的單鏈表結(jié)構(gòu),我們稱其為不帶頭結(jié)點(diǎn)的單鏈表。

3-7是帶頭結(jié)點(diǎn)的單鏈表結(jié)構(gòu),頭結(jié)點(diǎn)是由頭指針?biāo)赶虻牟淮娣艛?shù)據(jù)元素的結(jié)點(diǎn)。我們把頭結(jié)點(diǎn)的數(shù)據(jù)域部分涂上陰影,以明顯表示該結(jié)點(diǎn)為頭結(jié)點(diǎn)。

單循環(huán)鏈表

單循環(huán)鏈表,簡(jiǎn)稱循環(huán)鏈表(circular list), 是線性表的另一種鏈表表示,它的結(jié)點(diǎn)結(jié)構(gòu)與單鏈表相同,由一個(gè)數(shù)據(jù)域和一個(gè)指針域組成,與單鏈表不同的是鏈表中表尾結(jié)點(diǎn)的next域中不是NULL,而是存放了head所指的結(jié)點(diǎn)。

在單循環(huán)鏈表中判斷當(dāng)前指針pcurrent是否到達(dá)鏈表尾的條件應(yīng)是pcurrent->next == head。

單循環(huán)鏈表也有不帶頭結(jié)點(diǎn)和帶頭結(jié)點(diǎn)兩種結(jié)構(gòu),分別如圖3-14,圖3-15所示。

對(duì)單循環(huán)鏈表,只要知道表中任一結(jié)點(diǎn)的地址,就能遍歷表中其他任何結(jié)點(diǎn)。循環(huán)鏈表的運(yùn)算與單鏈表類似,不過(guò)在鏈頭與鏈尾處理時(shí)有所不同。

總結(jié)

以上是生活随笔為你收集整理的Java数据结构和算法:线性表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。