567
社区成员
发帖
与我相关
我的任务
分享
用Go编写一个Linktable的库
linkNode中包含了节点的数据域和指针域,Link中包含了链表的长度和表头表尾节点
type LinkNode struct {
nodeData data
next *LinkNode
}
type Link struct {
head *LinkNode
tail *LinkNode
len int
}
可见有初始化链表 判断是否为空 删除链表 增加链表结点 删除链表结点 根据索引查找结点的功能
type LinkNodeInterface interface{
initLink()
IsEmpty(link *Link)
DeleteLink(link *Link)
AddNode(linkNode *LinkNode, link *Link)
DeleteNode(linkNode *LinkNode, link *Link)
FindNodeByIndex(index int, link *Link)
}
func initLink() *Link {
var link *Link = new(Link)
link.tail = nil
link.head = nil
link.len = 0
return link
}
func IsEmpty(link *Link) bool {
if link.len == 0{
return true
}else {
return false
}
}
func DeleteLink(link *Link) bool {
if link != nil {
for link.head!=nil {
link.head = link.head.next
link.len--
}
link.head = nil
link.tail = nil
return true
}
return false
}
func AddNode(linkNode *LinkNode, link *Link) int {
if link == nil || linkNode == nil {
return -1
}
if link.len==0 {
link.head = linkNode
link.tail = linkNode
link.len++
} else {
link.tail.next = linkNode
link.tail = linkNode
link.len++
}
return 1
}
func DeleteNode(linkNode *LinkNode, link *Link) int {
if link == nil || linkNode == nil {
return -1
}
if linkNode == link.head {
if link.len == 1 {
link.head = nil
link.tail = nil
} else {
link.head = link.head.next
}
link.len--
return 1
}
var p *LinkNode = link.head
for p.next != link.tail {
if p.next == linkNode {
p.next = p.next.next
link.len--
return 1
}
p = p.next
}
if p.next == linkNode {
p.next=nil
link.tail = p
link.len--
return 1
}
return 0
}
func FindNodeByIndex(index int, link *Link) *LinkNode {
if link == nil || index<0 {
return nil
}
var p *LinkNode = link.head
for i := 0; i < index; i++ {
p = p.next
}
return p
}
func main() {
var link *Link = initLink()
var linkNodeTest1 *LinkNode = new(LinkNode)
linkNodeTest1.nodeData = "testLink"
AddNode(linkNodeTest1, link)
var linkNodeTest2 *LinkNode = new(LinkNode)
linkNodeTest2.nodeData = 2
AddNode(linkNodeTest2, link)
fmt.Println("len:", link.len)
fmt.Println("Head:", link.head.nodeData)
fmt.Println("Tail:", link.tail.nodeData)
DeleteNode(linkNodeTest2, link)
fmt.Println("len:", link.len)
var linkNodeTest3 *LinkNode = FindNodeByIndex(0, link)
fmt.Println("linkNodeTest3 data:", linkNodeTest3.nodeData)
DeleteLink(link)
fmt.Println("len:", link.len)
}
作者:329