golang实现链表

时间:2014-02-11 05:09:28

标签: go

我正在尝试在golang中实现一个已排序的链表。而且我很难想出一种通用的方法来使链表适用于任何可以与自身进行比较的类型。由于它是一个排序列表,我希望'go compiler'确保可以比较插入到链表中的值。

例如,

import "linkedlist"

type Person struct {
  name string
}

func main() {
  l := linkedlist.New()
  p := Person{"Jay"}
  l.insert(p)
}

在上面的示例中,如何使编译器确保将具有“Person”类型的值“p”与另一个也具有“Person”类型的值进行比较。我希望编译器在插入的值不合适的情况下捕获错误。

我可以做这样的事情,

import "linkedlist"

type Element interface {
  func IsGreater(v Element{}) bool
}

type Person struct {
  name string
  age int
}

func (p *Person) IsGreater(p1 interface{}) bool {
  if ok, v := p1.(Person); ok && p.age > v.age {
    return true
  }
  return false
}

然后,在链表的“插入”功能中,我可以使用IsGreater函数来决定将元素放在链表中的位置。

我的问题是......

  1. 有更好的方法吗?比上面的解决方案更好的东西。
  2. 我已经完成了sort.Sort,看看它是如何完成的。它完成的方式是为类型的切片创建一个新类型,然后通过实现Len,Less和Swap使新类型实现排序接口。

    我也可以在我的案例中做同样的事情。但是必须创建一个新的切片类型,然后实现一些函数来满足一个接口,当我一次只处理2个相同类型的值时......对我来说似乎有点矫枉过正。

2 个答案:

答案 0 :(得分:1)

因为Golang不支持泛型,所以所有容器都应该使用接口{}并输入assert,我认为没有更好的解决方案满足你的要求。

答案 1 :(得分:0)

这方面的图书馆功能已经存在:

http://golang.org/pkg/container/list/

http://golang.org/pkg/container/ring/

您可以将列表与reflect.DeepEqual进行比较。

如果要实现使用类型检查的链接列表,请为列表type MyLinkedList struct { *list.List}创建一个嵌入式结构,为列表type Element struct{ *List.Element }中的项创建一个。然后,您可以实施list.List的所有方法,并根据需要进行类型检查。