1、什麼是循環鏈表node
循環鏈表的節點造成一個圈。把單鏈表的尾巴指向開頭造成單循環鏈表。把雙向鏈表的尾巴與開頭連接起來就造成雙向循環鏈表。使用循環鏈表能夠不斷的繞圈尋找所須要的數據,而不須要像單鏈表那樣每次都從開頭開始尋找,能夠提升查詢的效率。git
今天大衛哥先實現一個單向循環鏈表,雙向循環鏈表的實現就交給你們了。github
2、單向循環鏈表的Go實現ui
一、節點
spa
單向循環鏈表的節點和單鏈表的實現是相似的,不過爲了區別,咱們取了不一樣名字。code
type CNode struct { data Object next *CNode }
二、單向循環鏈表接口
單向循環鏈表車隊由5節車箱組成,1號車是車頭。爲了表示這種關係,大衛哥用下面的結構體來承載。隊列
type CList struct { size uint64 // 車箱數量 head *CNode // 車頭 }
3、接口說明及實現get
一、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、小結
鏈表內容就此結束了,下面一章大衛哥將講講棧和隊列,大衛哥將用鏈表實現。