這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
鏈表的資料結構比較線性數組,優點是 可以方便的對任意的位置進行插入和刪除。
這一特性使得它很適合於應用在排序等情境下,由於golang目前類庫還不是很完善,在java中可以很簡單的使用api提供的支援完成對list或者map的排序,在使用go時就沒有那麼幸運了,可能需要自己去實現。
下面的例子就是使用go package 中的LinkedList實現的排序的鏈表。
1.支援固定的長度
2.可自訂排序的規則
3.組合LinkedList功能
package codeforfunimport ( "container/list")type SortedLinkedList struct { *list.List Limit int compareFunc func (old, new interface{}) bool}func NewSortedLinkedList(limit int, compare func (old, new interface{}) bool) *SortedLinkedList { return &SortedLinkedList{list.New(), limit, compare}}func (this SortedLinkedList) findInsertPlaceElement(value interface{}) *list.Element { for element := this.Front(); element != nil; element = element.Next() { tempValue := element.Value if this.compareFunc(tempValue, value) { return element } } return nil}func (this SortedLinkedList) PutOnTop(value interface{}) { if this.List.Len() == 0 { this.PushFront(value) return } if this.List.Len() < this.Limit && this.compareFunc(value, this.Back().Value) { this.PushBack(value) return } if this.compareFunc(this.List.Front().Value, value) { this.PushFront(value) } else if this.compareFunc(this.List.Back().Value, value) && this.compareFunc(value, this.Front().Value) { element := this.findInsertPlaceElement(value) if element != nil { this.InsertBefore(value, element) } } if this.Len() > this.Limit { this.Remove(this.Back()) }}
package mainimport ( "fmt" "codeforfun")type WordCount struct { Word string Count int}func compareValue(old, new interface {}) bool { if new.(WordCount).Count > old.(WordCount).Count { return true } return false}func main() { wordCounts := []WordCount{ WordCount{"kate", 87}, WordCount{"herry", 92}, WordCount{"james", 81}} var aSortedLinkedList = codeforfun.NewSortedLinkedList(10, compareValue) for _, wordCount := range wordCounts { aSortedLinkedList.PutOnTop(wordCount) } for element := aSortedLinkedList.List.Front(); element != nil; element = element.Next() { fmt.Println(element.Value.(WordCount)) }}
還可以訪問我樹莓派上搭的部落格地址:
http://www.codeforfun.info/