




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第詳解Go語言中單鏈表的使用目錄鏈表單鏈表結(jié)構(gòu)創(chuàng)建節(jié)點遍歷鏈表頭插法尾插法遍歷方法鏈表長度鏈表轉(zhuǎn)數(shù)組數(shù)組轉(zhuǎn)鏈表
鏈表
一種物理存儲單元上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。鏈表由一系列結(jié)點(鏈表中每一個元素稱為結(jié)點)組成,結(jié)點可以在運行時動態(tài)生成。每個結(jié)點包括兩個部分:一個是存儲數(shù)據(jù)元素的數(shù)據(jù)域,另一個是存儲下一個結(jié)點地址的指針域。使用鏈表結(jié)構(gòu)可以避免在使用數(shù)組時需要預(yù)先知道數(shù)據(jù)大小的缺點,鏈表結(jié)構(gòu)可以充分利用計算機內(nèi)存空間,實現(xiàn)靈活的內(nèi)存動態(tài)管理。但是鏈表失去了數(shù)組隨機讀取的優(yōu)點,同時鏈表由于增加了結(jié)點的指針域,空間開銷比較大。
單鏈表結(jié)構(gòu)
利用struct可以包容多種數(shù)據(jù)類型,結(jié)構(gòu)體內(nèi)也可以包含多個成員,這些成員可以是基本類型、自定義類型、數(shù)組類型,也可以是指針類型。這里可以使用指針類型成員來存放下一個結(jié)點的地址。如以下定義,成員data用來存放結(jié)點中的數(shù)據(jù)(整數(shù)類型),next是指針類型的成員,它指向ListNodestruct類型數(shù)據(jù),也就是下一個結(jié)點的數(shù)據(jù)類型。
typeListNodestruct{
dataint
next*ListNode
創(chuàng)建節(jié)點
節(jié)點聲明和賦值有以下幾種格式:
packagemain
import"fmt"
typeListNodestruct{
dataint
next*ListNode
funcmain(){
varhead*ListNode
head=new(ListNode)
head.data=1
varnode1=new(ListNode)
node1.data=2
varnode2=ListNode{3,nil}
varnode3=ListNode{data:4}
fmt.Println(*head)
fmt.Println(*node1)
fmt.Println(*node2)
fmt.Println(*node3)
/*輸出:
{1nil}
{2nil}
{3nil}
{4nil}
*/
遍歷鏈表
一個for循環(huán)即可,結(jié)構(gòu)描述的鏈表沒有空鏈表的,不論data是何種類型,一旦聲明即使不馬上賦值也會有類型默認值,比如new(ListNode)即賦值了ListNode{0,nil}。
funcshowNode(p*ListNode){
fmt.Print(*p)
forp.next!=nil{
p=p.next
fmt.Print("-",*p)
fmt.Println()
頭插法
新結(jié)點放在鏈表的最前面
packagemain
import"fmt"
typeListNodestruct{
dataint
next*ListNode
funcshowNode(p*ListNode){
fmt.Print(*p)
forp.next!=nil{
p=p.next
fmt.Print("-",*p)
fmt.Println()
funcmain(){
varhead=ListNode{0,nil}
fori:=1;ii++{
varnode=ListNode{data:i}
node.next=head
head=node
showNode(head)
/*輸出:
{40xc000084250}-{30xc000084240}-{20xc000084230}-{10xc000084220}-{0nil}
*/
尾插法
新結(jié)點追加到鏈表的最后面
packagemain
import"fmt"
typeListNodestruct{
dataint
next*ListNode
funcshowNode(p*ListNode){
fmt.Print(*p)
forp.next!=nil{
p=p.next
fmt.Print("-",*p)
fmt.Println()
funcmain(){
varhead,tail*ListNode
head=ListNode{0,nil}
tail=head
fori:=1;ii++{
varnode=ListNode{data:i}
(*tail).next=node
tail=node
showNode(head)
/*輸出:
{00xc000084220}-{10xc000084230}-{20xc000084240}-{30xc000084250}-{4nil}
*/
遍歷方法
方法的定義:參數(shù)表放在函數(shù)名前
packagemain
import"fmt"
typeListNodestruct{
dataint
next*ListNode
func(p*ListNode)travel(){
fmt.Print(p.data)
forp.next!=nil{
p=p.next
fmt.Print("-",p.data)
fmt.Println("nil")
funcmain(){
varhead=ListNode{0,nil}
()
fori:=1;ii++{
varnode=ListNode{data:i}
node.next=head
head=node
()
varroot*ListNode
root=new(ListNode)
()
/*輸出:
0nil
9-8-7-6-5-4-3-2-1-0nil
0nil
*/
鏈表長度
注意:函數(shù)與方法的區(qū)別
packagemain
import"fmt"
typeListNodestruct{
dataint
next*ListNode
func(head*ListNode)size()int{
size:=1
forhead=head.next;head!=nil;size++{
head=head.next
returnsize
funcLen(head*ListNode)int{
size:=1
forhead=head.next;head!=nil;size++{
head=head.next
returnsize
funcmain(){
varhead=ListNode{0,nil}
fmt.Println(Len(head))
fmt.Println(head.size())
fori:=1;ii++{
varnode=ListNode{data:i}
node.next=head
head=node
fmt.Println(Len(head))
fmt.Println(head.size())
/*輸出:
*/
鏈表轉(zhuǎn)數(shù)組
packagemain
import(
"fmt"
typeListNodestruct{
dataint
next*ListNode
func(head*ListNode)size()int{
size:=1
forhead=head.next;head!=nil;size++{
head=head.next
returnsize
func(head*ListNode)tolist()[]int{
varres[]int
res=make([]int,0,head.size())
forhead.next!=nil{
res=append(res,head.data)
head=head.next
res=append(res,head.data)
returnres
func(head*ListNode)tolist2()[]int{
varres[]int
res=make([]int,0,head.size())
res=append(res,head.data)
head=head.next
forhead!=nil{
res=append(res,head.data)
head=head.next
returnres
funcmain(){
varhead=ListNode{0,nil}
fori:=1;ii++{
varnode=ListNode{data:i}
node.next=head
head=node
fmt.Println(head.tolist())
varroot,tail*ListNode
root=ListNode{0,nil}
tail=root
fori:=1;ii++{
varnode=ListNode{data:i}
(*tail).next=node
tail=node
fmt.Println(root.tolist2())
/*輸出:
[9876543210]
[0123456789]
*/
數(shù)組轉(zhuǎn)鏈表
packagemain
import"fmt"
typeListNodestruct{
dataint
next*ListNode
func(p*ListNode)travel(){
fmt.Print(p.data)
forp.next!=nil{
p=p.next
fmt.Print("-",p.data)
fmt.Println("nil")
functoNode(list[]int)*ListNode{
varhead,tail*ListNode
head=ListNode{list[0],nil}
tail=head
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公基考試題型及答案
- 工地出納師考試題及答案
- 高中課外考試題目及答案
- 測繪培訓(xùn)考試題目及答案
- 2025年高二物理下學(xué)期物理夏令營選拔試題
- 2025年病案編碼員考試題庫(三)資格證考試模擬試題練習(xí)(含答案)
- 公司高管面試試題及答案
- 商業(yè)機密保護和守密承諾書(3篇)
- 低碳環(huán)保園區(qū)承諾書(9篇)
- 企業(yè)經(jīng)營與管理責任履行承諾函(8篇)
- 廚房火災(zāi)安全培訓(xùn)教材課件
- 丙烯畫風景課件
- 醫(yī)院醫(yī)保培訓(xùn)試題及答案
- DB15∕T 3843-2025 新能源分布式電源并網(wǎng)技術(shù)規(guī)范
- 外市電安全培訓(xùn)課件
- 《鋰電池的制造工藝》課件
- 生物試劑庫存管理辦法
- 海上風電場安全監(jiān)測技術(shù)的現(xiàn)狀與未來發(fā)展趨勢
- 渠道考試題及答案
- 村級財務(wù)業(yè)務(wù)知識培訓(xùn)課件
- 美術(shù)基礎(chǔ) 課件全套 第1-5章 美術(shù)簡介 -中國民間美術(shù)
評論
0/150
提交評論