Go語(yǔ)言的列表list

參考:
http://c.biancheng.net/view/35.html

關(guān)鍵點(diǎn)

列表list內(nèi)部是雙鏈表

列表能夠高效地進(jìn)行任意位置的元素插入刪除操作

可以通過(guò)newvar 進(jìn)行聲明列表

列表的元素類型屏轰,沒(méi)有限制钝鸽,

list的使用場(chǎng)景

各種類型的元素 組成時(shí),可以使用列表list

在Go語(yǔ)言中昆淡,列表使用 container/list 包來(lái)實(shí)現(xiàn)勋拟,內(nèi)部的實(shí)現(xiàn)原理是雙鏈表括荡。

1疏遏、初始化列表

list 的初始化有兩種方法:
分別是使用

  • New() 函數(shù)
  • var 關(guān)鍵字聲明,

兩種方法的初始化效果都是一致的目养。

  1. 通過(guò) container/list 包的New() 函數(shù)初始化 list

變量名 := list.New()

  1. 通過(guò) var 關(guān)鍵字聲明初始化 list

var 變量名 list.List

2俩由、列表切片和 map不同的是,

列表并沒(méi)有具體元素類型限制癌蚁,因此幻梯,列表的元素可以是任意類型兜畸,這既帶來(lái)了便利,

也引來(lái)一些問(wèn)題礼旅,例如給列表中放入了一個(gè) interface{} 類型的值膳叨,取出值后,

如果要將 interface{} 轉(zhuǎn)換為其他類型將會(huì)發(fā)生宕機(jī)痘系。

3菲嘴、在列表中插入元素

雙鏈表支持從隊(duì)列前方或后方插入元素,分別對(duì)應(yīng)的方法是

  • PushFront
  • PushBack汰翠。

提示
這兩個(gè)方法都會(huì)返回一個(gè) *list.Element 結(jié)構(gòu)龄坪,如果在以后的使用中需要?jiǎng)h除插入的元素,則只能通過(guò) *list.Element 配合 Remove() 方法進(jìn)行刪除复唤,這種方法可以讓刪除更加效率化健田,同時(shí)也是雙鏈表特性之一。

下面代碼展示如何給 list

l := list.New()
l.PushBack("fist")
l.PushFront(67)

代碼說(shuō)明如下:

  • 第 1 行佛纫,創(chuàng)建一個(gè)列表實(shí)例妓局。
  • 第 3 行,將 fist 字符串插入到列表的尾部呈宇,此時(shí)列表是空的好爬,插入后只有一個(gè)元素。
  • 第 4 行甥啄,將數(shù)值 67 放入列表存炮,此時(shí),列表中已經(jīng)存在 fist 元素蜈漓,67 這個(gè)元素將被放在 fist 的前面穆桂。
image

4、從列表中刪除元素

列表插入函數(shù)的返回值會(huì)提供一個(gè) *list.Element 結(jié)構(gòu)融虽,這個(gè)結(jié)構(gòu)記錄著列表元素的值以及與其他節(jié)點(diǎn)之間的關(guān)系等信息享完,從列表中刪除元素時(shí),需要用到這個(gè)結(jié)構(gòu)進(jìn)行快速刪除有额。

列表操作元素:

package main
import "container/list"
func main() {
    l := list.New()
    // 尾部添加
    l.PushBack("canon")
    // 頭部添加
    l.PushFront(67)
    // 尾部添加后保存元素句柄
    element := l.PushBack("fist")
    // 在fist之后添加high
    l.InsertAfter("high", element)
    // 在fist之前添加noon
    l.InsertBefore("noon", element)
    // 使用
    l.Remove(element)
}

代碼說(shuō)明如下:

  • 第 6 行驼侠,創(chuàng)建列表實(shí)例。
  • 第 9 行谆吴,將字符串 canon 插入到列表的尾部。
  • 第 12 行苛预,將數(shù)值 67 添加到列表的頭部句狼。
  • 第 15 行,將字符串 fist 插入到列表的尾部热某,并將這個(gè)元素的內(nèi)部結(jié)構(gòu)保存到 element 變量中腻菇。
  • 第 18 行胳螟,使用 element 變量,在 element 的位置后面插入 high 字符串筹吐。
  • 第 21 行糖耸,使用 element 變量,在 element 的位置前面插入 noon 字符串丘薛。
  • 第 24 行嘉竟,移除 element 變量對(duì)應(yīng)的元素。

下表中展示了每次操作后列表的實(shí)際元素情況洋侨。

列表元素操作的過(guò)程

5舍扰、遍歷列表——訪問(wèn)列表的每一個(gè)元素

遍歷雙鏈表需要配合 Front() 函數(shù)獲取頭元素,遍歷時(shí)只要元素不為空就可以繼續(xù)進(jìn)行希坚,每一次遍歷都會(huì)調(diào)用元素的 Next() 函數(shù)边苹,代碼如下所示。

l := list.New()
// 尾部添加
l.PushBack("canon")
// 頭部添加
l.PushFront(67)
for i := l.Front(); i != nil; i = i.Next() {
    fmt.Println(i.Value)
}

代碼輸出如下:

67
canon

代碼說(shuō)明如下:

  • 第 1 行裁僧,創(chuàng)建一個(gè)列表實(shí)例个束。
  • 第 4 行,將 canon 放入列表尾部聊疲。
  • 第 7 行茬底,在隊(duì)列頭部放入 67。
  • 第 9 行售睹,使用 for 語(yǔ)句進(jìn)行遍歷桩警,其中 i:=l.Front() 表示初始賦值,只會(huì)在一開始執(zhí)行一次昌妹,每次循環(huán)會(huì)進(jìn)行一次 i != nil 語(yǔ)句判斷捶枢,如果返回 false,表示退出循環(huán)飞崖,反之則會(huì)執(zhí)行 i = i.Next()烂叔。
  • 第 10 行,使用遍歷返回的 *list.Element 的 Value 成員取得放入列表時(shí)的原值固歪。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蒜鸡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子牢裳,更是在濱河造成了極大的恐慌逢防,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒲讯,死亡現(xiàn)場(chǎng)離奇詭異忘朝,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)判帮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門局嘁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)溉箕,“玉大人,你說(shuō)我怎么就攤上這事悦昵‰惹眩” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵但指,是天一觀的道長(zhǎng)寡痰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)枚赡,這世上最難降的妖魔是什么氓癌? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮贫橙,結(jié)果婚禮上贪婉,老公的妹妹穿的比我還像新娘。我一直安慰自己卢肃,他們只是感情好疲迂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著莫湘,像睡著了一般尤蒿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幅垮,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天腰池,我揣著相機(jī)與錄音,去河邊找鬼忙芒。 笑死示弓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呵萨。 我是一名探鬼主播奏属,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼潮峦!你這毒婦竟也來(lái)了囱皿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤忱嘹,失蹤者是張志新(化名)和其女友劉穎嘱腥,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拘悦,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡齿兔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愧驱。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖椭盏,靈堂內(nèi)的尸體忽然破棺而出组砚,到底是詐尸還是另有隱情,我是刑警寧澤掏颊,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布糟红,位于F島的核電站,受9級(jí)特大地震影響乌叶,放射性物質(zhì)發(fā)生泄漏盆偿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一准浴、第九天 我趴在偏房一處隱蔽的房頂上張望事扭。 院中可真熱鬧,春花似錦乐横、人聲如沸求橄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)罐农。三九已至,卻和暖如春催什,著一層夾襖步出監(jiān)牢的瞬間涵亏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蒲凶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留气筋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓豹爹,卻偏偏與公主長(zhǎng)得像裆悄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子臂聋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容