1. 程式人生 > 其它 >golang grpc head為空_Golang實現單向連結串列的基礎操作

golang grpc head為空_Golang實現單向連結串列的基礎操作

技術標籤:golang grpc head為空

連結串列作為資料結構基礎的一部分,在平時程式設計中也會經常用到,其本身使用起來也非常的靈活,所以連結串列對於程式設計人員來說非常值得我們去學習和掌握。

上一篇我們講解了Golang函式的基礎教程,本期我們將對單向連結串列的使用進行講解說明,並用Go語言實現增、刪、查和翻轉的基本操作,相對前面兩篇的基礎教程來說,可以算是進階篇了。歡迎大家閱讀學習。

連結串列簡介 連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列節點組成,節點可以在執行時動態生成,節點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。 單向連結串列結構
f1001aca4657c6d4468e9d018e921dde.png
  • 基礎結構描述

單向連結串列是連結串列的一種,其特點是連結串列的連結方向是單向的,連結串列的遍歷要從頭部開始順序讀取;結點構成,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函式