##link.go 的代码如下:
package main
import "fmt"
type LinkNode struct {
data interface{}
next *LinkNode
}
type Link struct {
head *LinkNode
tail *LinkNode
}
func (p *Link) InsertHead(data interface{}) {
node := &LinkNode{
data: data,
next: nil,
}
if p.head == nil && p.tail == nil {
p.head = node
p.tail = node
return
}
node.next = p.head
p.head = node
}
func (p *Link) InsertTail(data interface{}) {
node := &LinkNode{
data: data,
next: nil,
}
if p.head == nil && p.tail == nil {
p.head = node
p.tail = node
return
}
p.tail.next = node
p.tail = node
}
func (p *Link) Trans() {
q := p.head
if q != nil {
fmt.Println(q.data)
q = q.next
}
}`
##测试的main.go 代码如下:
' package main
func main() {
var l Link
for i := 1; i < 10; i++ {
l.InsertTail(i)
//l.InsertTail(fmt.Sprintf("str %d", i))
}
l'.T-ns()
}
##打印结果,不管我是尾插,还是头插打印了一个出来。。。
前面链表的数据结构表示,就存在问题,不清晰,不符合链表节点的定义。
按照你这个意思,是双向链表,链表中的每一个节点,应该包含3个属性:本节点的数据,前一节点的指向,后一节点的指向。指向可以用指针、序号,等等来表示。
你前面那个链表的GO实现数据结构,显然不符合链表的数据结构表达。
数据结构表达就存在问题,后面的算法就没有看下去的必要了。
数据结构首先要表达正确,后面的算法才存在价值。
#7