//示例45
package main
import "fmt"
func main() {
var intlink Link
for i := 0; i < 10; i++ {
intlink.InsertTail(i)
}
intlink.Trans()
}
//节点
type LinkNode struct {
data interface{} //内容
next *LinkNode //next指针
}
//链表
type Link struct {
head *LinkNode //头节点
tail *LinkNode //尾节点
}
//头插法
func (p *Link) InsertHead(data interface{}) {
//获取一个节点
node := &LinkNode{
data: data,
next: nil,
}
//判断是否第一个节点,如果是头节点和尾节点都是自己
if p.tail == nil && p.head == nil {
p.tail = node
p.head = node
return
}
//如果不是第一个节点 新节点的next是链表的头节点
node.next = p.head
//链表头节点指向新节点
p.head = node
}
//尾插法
func (p *Link) InsertTail(data interface{}) {
node := &LinkNode{
data: data,
next: nil,
}
//判断是否第一个节点,如果是头指针和尾指针都是自己
if p.tail == nil && p.head == nil {
p.tail = node
p.head = node
return
}
//链表的尾节点的next指针指向新节点
p.tail.next = node
//链表的尾节点指向新节点
p.tail = node
}
//遍历
func (p *Link) Trans() {
q := p.head
for q != nil {
fmt.Println(q.data)
q = q.next //移动指针
}
}