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. 备份IIS httpd.ini 重写规则,兼容大部分版本号IISserver

    IISserver已经非常少,差点儿要退出市场了.nginx成为市场的主流. 备份一个httpd.ini,全部内容例如以下: [ISAPI_Rewrite] # 3600 = 1 hour Cache ...

  2. Android Notification通知详细解释

    Android Notification通知具体解释  Notification: (一).简单介绍:         显示在手机状态栏的通知. Notification所代表的是一种具有全局效果的通 ...

  3. 湘潭oj1203/邀请赛A称号 数论+java睑板

    乞讨 n%1+n%2+n%3+n%4+.........n%n=,n<=10^12次要. 一味的找规律之初.没有发现.后来,前辈执教后,人才平淡,所以,现在唯一明确的. 首先在地图上: 对于该题 ...

  4. IS2009制作Oracle 静默安装包(一)感谢空白先生特许授权

    原文:IS2009制作Oracle 静默安装包(一)感谢空白先生特许授权 上一篇: MyEclipse中消除frame引起的“the file XXX can not be found.Please ...

  5. Asp.Net MVC路由调试好帮手RouteDebugger

    Asp.Net MVC路由调试好帮手RouteDebugger 1.获取方式 第一种方法: 在程序包控制台中执行命令 PM> Install-Package routedebugger 安装成功 ...

  6. 框架Asp.net Identity

    框架Asp.net Identity 在Asp.net上,微软的membershop框架经历了Asp.net membership到Asp.net simple membership,再到现在的Asp ...

  7. ORA-00265: instance recovery required, cannot set ARCHIVELOG mode

    症状: 我打开后归档命令报告运行错误ORA-00265 SQL> alter database archivelog; alter database archivelog * ERROR at ...

  8. hibernate实体类型映射文件

    1.通过写hibernate映射文件.实体类型转换为数据库中的表 据实体类型而写的. 实体类型User.java package cn.wwh.www.hibernate.dd.property; i ...

  9. C# 利用SMTP异步发送邮件

    C#实现收发邮件功能需要用到两个命名空间  System.Net; 和 System.Net.Mail; SmtpClient client = new SmtpClient("smtp.g ...

  10. [转载]Android中WebView自适应屏幕

    webview中右下角的缩放按钮能不能去掉 settings.setDisplayZoomControls(false); //隐藏webview缩放按钮 让Webview加载的页面居中显示有我知道的 ...