golang grpc head為空_Golang實現單向連結串列的基礎操作
阿新 • • 發佈:2021-01-04
技術標籤:golang grpc head為空
連結串列作為資料結構基礎的一部分,在平時程式設計中也會經常用到,其本身使用起來也非常的靈活,所以連結串列對於程式設計人員來說非常值得我們去學習和掌握。
上一篇我們講解了Golang函式的基礎教程,本期我們將對單向連結串列的使用進行講解說明,並用Go語言實現增、刪、查和翻轉的基本操作,相對前面兩篇的基礎教程來說,可以算是進階篇了。歡迎大家閱讀學習。
連結串列簡介 連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列節點組成,節點可以在執行時動態生成,節點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。 單向連結串列結構基礎結構描述
單向連結串列是連結串列的一種,其特點是連結串列的連結方向是單向的,連結串列的遍歷要從頭部開始順序讀取;結點構成,head指標指向第一個成為表頭結點,終止於最後一個指向NULL的指標。
連結串列基本操作分別在表頭、表尾和表中間新增資料
1、定義連結串列結構體和節點結構體,程式碼如下:
// 定義節點結構體type Node struct { Data interface{} // 介面型別的資料data Next *Node // 下一個節點}// 定義單向連結串列結構體type LinkList struct { Header *Node // 頭節點,指向第一個節點 Length int // 連結串列長度}
2、編寫建立節點和建立單向連結串列結構的函式
// 建立節點函式func CreateNode(data interface{}) *Node { return &Node{ Data: data, // 新增的資料data Next: nil, }}// 建立連結串列方法func CreateLinkList() *LinkList { return &LinkList{ Header: CreateNode(nil), // 頭節點,初始化為空 Length: 0, // 連結串列長度,初始化為0 }}
3、定義在頭節點新增資料的方法
// 在頭節點插入資料的方法func (l *LinkList) AddInHead(data interface{}) { // 建立新節點,傳入要加入的資料data newNode := CreateNode(data) defer func() { l.Length++ }()//進行邏輯判斷處理,在頭節點新新增資料 if l.Length == 0 { l.Header = newNode }else {newNode.Next=l.Headerl.Header=newNode//頭指標指向新加的 }}
4、定義在尾節點新增資料的函式
// 在連結串列尾部新增元素func (l *LinkList) Append(data interface{}) { newNode := CreateNode(data) defer func() { l.Length++ }() if l.Length == 0 { l.Header = newNode return } // 遍歷連結串列到最後一個節點,再進行新增 current := l.Header for current.Next != nil { current = current.Next } current.Next = newNode //把新節點地址給最後一個節點的Next}
5、在連結串列中間i位置插入資料
// 在連結串列中間 i位置 插入元素func (l *LinkList) Insert(i int, data interface{}) { newNode := CreateNode(data) defer func() { l.Length++ }() if l.Length == 0 { l.Header = newNode return } // 插入位置為首位時,直接在頭部加入該元素即可 if i == 0 { l.AddInHead(data) return } // 插入特殊位置處理,預設在尾部新增,也可校驗返回錯誤提示資訊 if i < 0 || i >= l.Length { l.Append(data) return } // 遍歷下一個節點,直到遍歷的位置等於需要插入的i位置 current := l.Header j := 1 for j < i { current = current.Next j++ } // 插入節點元素 newNode.Next = current.Next current.Next = newNode}
遍歷連結串列資料
// 遍歷單向連結串列並打印出來func (l *LinkList) ScanLinkList() { current := l.Header i := 1 for current.Next != nil {fmt.Printf("第%d 個節點的值為:%d\n",i,current.Data) current = current.Next i++ } fmt.Printf("第 %d 個節點的值為:%d\n", i, current.Data)}
刪除位置為 i 的資料
// 刪除第 i 個節點的元素func (l *LinkList) Delete(i int) { defer func() { l.Length-- }()//特殊情況校驗,i小與0或i大於連結串列長度的情況 if l.Length == 0 || i < 0 || i > l.Length-1 { fmt.Println("i is wrongful") return }//i等於0表示刪除頭節點 if i == 0 { l.Header = l.Header.Next return } // 非頭節點,則遍歷到 i 位置再刪除 j := 1 current := l.Header for j < i && current.Next != nil { current = current.Next j++ } if current.Next == nil { current = nil return }current.Next=current.Next.Next}
單向連結串列翻轉
// 單向連結串列翻轉func (l *LinkList) ReverseList() { current := l.Header var pre *Node for current != nil {//巧妙的利用go特性來進行節點指標位置交換 current, current.Next, pre = current.Next, pre, current } l.Header = pre}
最後對以上基礎操作進行呼叫測試
func main() { // 建立單向連結串列例項 link := CreateLinkList() // 測試 在頭節點新增元素 link.AddInHead(23) link.AddInHead(22) link.AddInHead(21) // 遍歷列印單向連結串列元素 //link.ScanLinkList() // 測試 在連結串列最後節點新增元素 link.Append(24) link.Append(25) // 遍歷列印單向連結串列元素 //link.ScanLinkList() // 測試 在連結串列中間 i 位置插入元素 link.Insert(1, 99) // 遍歷列印單向連結串列元素 //link.ScanLinkList() // 測試 刪除第 i 位的元素 link.Delete(1) // 遍歷列印單向連結串列元素 //link.ScanLinkList() // 測試 翻轉單向連結串列 link.ReverseList() // 遍歷列印單向連結串列元素 link.ScanLinkList()}
以上是用Go語言對單向連結串列基礎操作的實現,完整程式碼歸檔路徑:https://github.com/Scoefield/gokeyboardman/tree/main/singlelink
感謝您的閱讀,如有疑問或意見請及時反饋給我們。
推薦閱讀:
Golang函式