1. 程式人生 > >GO語言學習:container包中的list和ring

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).