title: Go数据结构与算法-单链表
tags: go,算法
介绍
相比数组,链表是要稍微复杂一点的数据结构。链表是一种线性表,但是不会按照线性的顺序存储数据,而是在每一个节点里面存到写一个节点的指针。作为单链表它最大的特点就是能随意增加长度,也能随意减少长度。
链表的结构我们可以抽象的看成一个火车,火车头代表着链表的头部,车厢代表着链表中的节点,数据则带着每节车厢中的货物。
链表的特性:
- 插入元素容易
- 元素访问困难
链表的操作是通过指针来实现的,这个指针类似一个火车管理员,它可以对火车的车厢进行添加和减少,也可以根据车厢号查找货物。
代码演示
package main
import "fmt"
type Item interface {
}
type Node struct {
Data Item
NextNode *Node
}
var head *Node
var curr *Node
func (node *Node)CreateHeadNode(data Item) {
node = new(Node)
node.Data = data
node.NextNode = nil
head = node
curr = node
}
func (node *Node)AddNode(data Item) {
node= new(Node)
node.Data = data
node.NextNode = nil
curr.NextNode = node
curr = node
}
func (node *Node)ShowNodes() {
node = head
for {
if node.NextNode == nil {
fmt.Println(node.Data)
break
} else {
fmt.Println(node.Data)
node = node.NextNode
}
}
}
func (node *Node)NodeCnt() int {
var cnt int = 1
node = head
for {
if node.NextNode == nil {
break
} else {
node = node.NextNode
cnt = cnt + 1
}
}
return cnt
}
func (node *Node)InsertNodeByIndex(index int, data Item) {
if index == 0 {
node.Data = data
node.NextNode = head
head = node
} else if index > node.NodeCnt()-1 {
node.AddNode(data)
} else {
var n = head
for i := 0; i < index-1; i++ {
n = n.NextNode
}
var newNode *Node = new(Node)
newNode.Data = data
newNode.NextNode = n.NextNode
n.NextNode = newNode
}
}
func (node *Node)DeleteNodeByIndex(index int) {
node = head
if index == 0 {
head = node.NextNode
} else {
for i := 0; i < index-1; i++ {
node = node.NextNode
}
node.NextNode = node.NextNode.NextNode
}
}
func (node *Node)UpdateNodeByIndex(index int, data Item) {
node = head
if index == 0 {
head.Data = data
} else {
for i := 0; i < index; i++ {
node = node.NextNode
}
node.Data = data
}
}
func main() {
p :=head
p.CreateHeadNode(0)
for i:=1; i<10;i++{
p.AddNode(i)
}
fmt.Printf("打印所有节点\n")
p.ShowNodes()
fmt.Printf("一共有%d个节点\n", p.NodeCnt())
fmt.Printf("当前节点:")
fmt.Println(p.NodeCnt())
p.DeleteNodeByIndex(2)
fmt.Println("删除节点2")
fmt.Printf("打印所有节点\n")
p.ShowNodes()
fmt.Printf("一共有%d个节点\n", p.NodeCnt())
fmt.Println("插入节点")
p.InsertNodeByIndex(2,2)
fmt.Printf("打印所有节点\n")
p.ShowNodes()
}
|
请发表评论