go实现排序的链表

Posted on 2013-08-14 23:25 mac的学习笔记 阅读(224) 评论(0) 编辑 收藏

链表的数据结构比较线性数组,优点是 可以方便的对任意的位置进行插入和删除。

这一特性使得它很适合于应用在排序等场景下,由于golang目前类库还不是很完善,在java中可以很简单的使用api提供的支持完成对list或者map的排序,在使用go时就没有那么幸运了,可能需要自己去实现。

下面的例子就是使用go package 中的LinkedList实现的排序的链表。

  • 有几个功能特性:

1.支持固定的长度

2.可自定义排序的规则

3.组合LinkedList功能

package codeforfun
import (
    "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 main
import (
    "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://geekfun.xicp.net/

go实现排序的链表的更多相关文章

  1. 剑指Offer面试题:16.合并两个排序的链表

    PS:这也是一道出镜率极高的面试题,我相信很多童鞋都会很眼熟,就像于千万人之中遇见不期而遇的人,没有别的话可说,唯有轻轻地问一声:“哦,原来你也在这里? ” 一.题目:合并两个排序的链表 题目:输入两 ...

  2. (剑指Offer)面试题17:合并两个排序的链表

    题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然时按照递增排序的. 链表结点定义如下: struct ListNode{ int val; ListNode* next; }; 思 ...

  3. P114、面试题17:合并两个排序的链表

    题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增顺序的.struct ListNode{      int    m_nKey;      ListNode*    m_p ...

  4. C#_约束 实现可排序单链表

    using System; using System.Collections.Generic; using System.Linq; using System.Text; /* 使用 约束 实现可排序 ...

  5. 剑指offer-面试题17.合并两个排序的链表

    题目:输入两个递增的排序的链表,合并这两个链表并使新链表中的节点仍然是 按照递增排序的.例如链表1链表2合并为链表3. List1:->->-> List2:->->-& ...

  6. 【剑指Offer学习】【面试题17 ::合并两个排序的链表】

    题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是依照递增排序的 链表结点定义例如以下: public static class ListNode { int value; List ...

  7. 剑指offer面试题17:合并两个排序的链表

    题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点人是按照递增排序的.解题思路:两个链表分别都已经是有序的了,遍历链表的时候只要比较两个链表当前位置大小,取出最小的添加到新链表中. 可以有 ...

  8. 《剑指offer》 合并两个排序的链表

    本题来自<剑指offer> 合并两个排序的链表 题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路: A:采用递归的方式(C++ C ...

  9. 【Java】 剑指offer(25) 合并两个排序的链表

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照 ...

随机推荐

  1. Android_开发人员经常使用的颜色

    Android开发中经常要用一些个性化的颜色,然而茫茫的RBG颜色对比表,往往给人眼花缭乱的感觉,更别说从中轻易选出一两种比較惬意的颜色,以下我就总结一下开发中经常使用到的比較绚丽的颜色. 以下是经常 ...

  2. C# foreach 有用方法具体解释

    网上查资料,说foreach 不能改动迭代变量,仅仅能訪问迭代变量.自己理解也不是非常深,通过几个代码进行验证,发现foreach的使用方法还有点特别 验证方法: 1. 迭代变量 为int int[] ...

  3. 通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0...

    原文:[原创]通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 'incorrect string value: '\xF0... 这篇blog重点在解决问题,如果你对 ...

  4. .NET:从 Mono、.NET Core 说起

    魅力 .NET:从 Mono..NET Core 说起 前段时间,被问了这样一个问题:.NET 应用程序是怎么运行的? 当时大概愣了好久,好像也没说出个所以然,得到的回复是:这是 .NET 程序员最基 ...

  5. Linux 查看和删除进程

    1. 在 LINUX 命令平台输入 1-2 个字符后按 Tab 键会自动补全后面的部分(前提是要有这个东西,例如在装了 tomcat 的前提下, 输入 tomcat 的 to 按 tab).2. ps ...

  6. SSH六部曲

    <strong> 一共有6步(文章底部附有源码下载地址,刚学完ssh的可以借鉴)</strong> 1 写一个Hibernate应用,完成用户的增加 1) User实体 2)U ...

  7. UIAutomator源码分析之启动和运行

    通过上一篇<Android4.3引入的UiAutomation新框架官方简介>我们可以看到UiAutomator其实就是使用了UiAutomation这个新框架,通过调用Accessibi ...

  8. UIAutomator定位Android控件的方法实践和建议(Appium姊妹篇)

    在本人之前的一篇文章<<Appium基于安卓的各种FindElement的控件定位方法实践和建议>>第二章节谈到Appium可以通过使用UIAutomator的方法去定位And ...

  9. 查看oracle数据库服务器的名字

    原文:查看oracle数据库服务器的名字 windows 中 1. select name from v$database ; 直接运行就可以查看了, 2.查看tnsnames.ora 的连接,有个S ...

  10. navigator,JS检测浏览器插件

    最早由Netscape Navigator 2.0引入的navigator对象,现在已经成为识别客户端浏览器的事实标准.虽然其它浏览器也通过其它方式提供了相同或相似的信息(例如,IE中的window. ...