循環鏈表的Go語言實現

1、什麼是循環鏈表node

%E5%BE%AA%E7%8E%AF%E9%93%BE%E8%A1%A8.png

循環鏈表的節點造成一個圈。把單鏈表的尾巴指向開頭造成單循環鏈表。把雙向鏈表的尾巴與開頭連接起來就造成雙向循環鏈表。使用循環鏈表能夠不斷的繞圈尋找所須要的數據,而不須要像單鏈表那樣每次都從開頭開始尋找,能夠提升查詢的效率。git

今天大衛哥先實現一個單向循環鏈表,雙向循環鏈表的實現就交給你們了。github

2、單向循環鏈表的Go實現ui

一、節點
%E6%AF%8F%E8%8A%82%E8%BD%A6%E5%8E%A2.pngspa

單向循環鏈表的節點和單鏈表的實現是相似的,不過爲了區別,咱們取了不一樣名字。code

type CNode struct {
 data Object
 next *CNode
}

二、單向循環鏈表接口

%E5%BE%AA%E7%8E%AF%E9%93%BE%E8%A1%A8%E7%BB%93%E6%9E%84.png

單向循環鏈表車隊由5節車箱組成,1號車是車頭。爲了表示這種關係,大衛哥用下面的結構體來承載。隊列

type CList struct {
    size uint64    // 車箱數量
    head *CNode    // 車頭
}

3、接口說明及實現get

%E5%8D%95%E5%BE%AA%E7%8E%AF%E9%93%BE%E8%A1%A8%E7%9A%84%E6%8E%A5%E5%8F%A3.png

一、Init初始化it

大衛哥是個乾脆的人,初始化的理由直接看前面幾節。此次直接上代碼。

func (cList *CList) Init() {
    lst := *cList
    lst.size = 0    // 沒車箱
    lst.head = nil  // 沒車頭
}

二、Append添加數據

將數據添加到鏈表的尾部。

func (cList *CList) Append(data Object) bool {
    node := new(CNode)
    (*node).data = data   // 安排一個新車箱,裝上data

    if cList.GetSize() == 0 {
        (*cList).head = node  // 第一輛車,直接做爲車頭
    } else {
        item := cList.GetHead() // 找到車尾
        for ; (*item).next != cList.GetHead(); item = (*item).next {}
        (*item).next = node // 把新車箱掛到車尾
    }

    (*node).next = (*cList).head // 車尾再掛上車頭
    (*cList).size++

    return true
}

三、InsertNext節點後面插入數據

在當前節點的後面,插入新的節點。

func (cList *CList) InsertNext(elmt *CNode, data Object) bool {
    if elmt == nil {
        return false
    }

    node := new(CNode)    // 安排一個新車箱,裝上data
    (*node).data = data

    (*node).next = (*elmt).next // elmt後面車箱,掛在新車箱後面
    (*elmt).next = node  // elmt後面掛上新車箱

    (cList).size++

    return true
}

四、Remove刪除節點

func (cList *CList) Remove(elmt *CNode) Object {
    if elmt == nil {
        return false
    }

    item := cList.GetHead() // 找到elmt的前面一節車箱
    for ; (*item).next != elmt; item = (*item).next {}

    (*item).next = (*elmt).next // 將前面一節車箱的繩索直接掛到後面一節車箱
    (*cList).size--

    return elmt.GetData()  // 返回elmt車箱裝的貨物
}

五、GetHead獲取鏈表開頭

func (cList *CList) GetHead() *CNode {
    return (*cList).head
}

六、GetSize獲取鏈表節點數量

func (cList *CList) GetSize() uint64 {
    return (*cList).size
}

七、GetData獲取節點裝的數據
GetData是節點的方法,獲取車箱裏裝的貨物。

func (node *CNode) GetData() Object {
    return (*node).data
}

八、GetNext獲取下一個節點
和GetData同樣是節點的方法,用於獲取下一個車箱。

func (node *CNode) GetNext() *CNode {
    return (*node).next
}

代碼下載

4、小結

鏈表內容就此結束了,下面一章大衛哥將講講棧和隊列,大衛哥將用鏈表實現。

相關文章
相關標籤/搜索