GO語言學習:container包中的list和ring
1.List
container/list 包
MoveBefore和MoveAfter分別用於把給定的元素移動到一個元素的前面和後面.
MoveToFront和MoveToBack分別用於把給定的元素移動到連結串列的最前端和最後端.
給定的元素都是*Element型別,*Element型別是Element的指標型別,*Element的值就是元素的指標.
func(l *List) MoveBefore(e,mark *Element)
func(l *List) MoveAfter(e,mark *Element)
func(l *List) MoveToFront(e *Element)
func(l *List) MoveToBack(e *Element)
在List包含的方法中,用於新插入元素的那些方法只接受interface{} 型別的值,這些方法在內部會使用Element值,包裝接收到的新元素.(避免直接使用我們自己生成的元素,避免連結串列內部關聯遭到內部破壞)
Front和Back分別用於獲取連結串列最前端和最後端的元素.
InsertBefore和InsertAfter分別用於在指定的元素之前和之後插入資料.
PushFront和PushBack則是向連結串列最前端和最後端插入資料.
func (l *List) Front( ) *Element
func (l *List) Back( ) *Element
func (l *List) InsertBefore( v interface{}, mark *Element) *Element
func (l *List) InsertAfter (v interface{},mark *Element) *Element
func (l *List) PushFront(v interface{}) *Element
func (l *List) PushBack(v interface{}) *Element
這些方法會把一個Element的值的指標作為結果返回,這就是連結串列留給我們的安全“介面”.
List這個結構體有2個欄位,一是Element型別的欄位root,另一個是int型別的len,前者代表根元素,後者代表長度 ,包級私有.
root和len都會被賦予相應的零值,len為0,root為Element{}.
Element型別包含了幾個包級私有的欄位,分別用於儲存前一個元素,後一個元素,以及所屬連結串列的指標值,還有一個公開的名叫value的欄位,用來儲存該元素的實際值,他是interface{}型別,在Element型別中這些的零值都是nil.
2.Ring
container/ring
Ring是一個迴圈連結串列,也就是我們俗稱的環
3.區別
Ring的資料結構僅由他自己表示,而List型別則需要他自己和Element型別聯合表示. 這是表示方式上的不同,也是資料結構上的不同.
一個Ring的值只代表了其所屬迴圈連結串列中的一環,而一個List的值則代表一個完整的連結串列.這是維度上的不同.
建立並初始化一個Ring的值得時候,我們可以指定包含的元素的個數,但對於一個List來說卻不能這樣,迴圈連結串列一旦被建立,其長度不可變.
var r ring.Ring : r代表一個長度為1的迴圈連結串列,var l list.List : l代表一個長度為0的連結串列, List中根元素不會持有任何實際元素值,因此計算長度的時候並不會計算它.
Ring 值得len方法的演算法複雜度是O(n),而List的len方法的演算法複雜度是O(1).