数据结构链表
下面我们来写一个单向的简单链表,首先我们要声明一个头节点是为了保存头节点信息,同理声明一个当前节点保存当前节点的信息,再然后声明一个节点类型的结构体,里面有两个变量,一个是节点的存储数据,数据类型为字符串,另一个是下一个节点的地址数据类型节点的指针类型。(package LinkNodes的内容写在LinkNodes文件夹下的node.go文件中)
package LinkNodes
import "fmt"
//声明全局变量,保存头节点
var head *Node
var curr *Node //当前节点
//声明节点类型
type Node struct {
//数据域
Data string
//地址域
NextNode *Node
}
接下来我们首先创建一个头节点,需要注意的是在设置完数据域和地址域后,要把头节点信息赋予前面声明的全局变量head,这个head变量在后面很多方法里我们都需要用到。
//创建头节点
func CreateHeadNode(data string) *Node {
var node *Node = new(Node)
// 设置数据结构体中的数据域
node.Data = data
//设置地址域
node.NextNode = nil
//保存头节点
head = node
curr = node
return node
}
接下来我们来创建多种操作链表的方法:
//添加新节点
func AddNode(data string) *Node {
var newNode *Node = new(Node)
//设置新节点重的数据域
newNode.Data = data
//设置地址域
newNode.NextNode = nil
//挂接节点
curr.NextNode = newNode
curr = newNode
return newNode
}
//遍历链表
func ShowNodes() {
var node = head
for {
if node.NextNode == nil {
fmt.Println(node.Data)
break
} else {
fmt.Println(node.Data)
node = node.NextNode
}
}
}
//计算节点的个数
func NodeCnt() int {
var cnt = 1
var node = head
for {
if node.NextNode == nil {
break
} else {
node = node.NextNode
cnt++
}
}
return cnt
}
//插入节点
func InsertNodeByIndex(index int, data string) *Node {
if index == 0 {
//添加新的头节点
var node *Node = new(Node)
node.Data = data
head = node
} else if index > NodeCnt()-1 {
//添加节点
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
}
return nil
}
//删除节点
func DeleteNodeByIndex(index int) {
var node = head
if index == 0 {
//删除头节点,第二个节点为头节点
head = node.NextNode
} else {
for i := 0; i < index; i++ {
node = node.NextNode
}
node.NextNode = node.NextNode.NextNode
}
}
//修改指定下标的节点内容
func UpdateNodeByIndex(index int, data string) {
var node = head
if index == 0 {
head.Data = data
} else {
for i := 0; i < index; i++ {
node = node.NextNode
}
node.Data = data
}
}
接下来我们在主函数中使用这些方法:
package main
import (
"MyHashMap_简单链表/LinkNodes"
"fmt"
)
func main() {
fmt.Println("Hello World!")
LinkNodes.CreateHeadNode("头节点")
LinkNodes.AddNode("第一节点")
LinkNodes.AddNode("第二节点")
LinkNodes.AddNode("第三节点")
LinkNodes.AddNode("第四节点")
LinkNodes.ShowNodes()
fmt.Println("共有",LinkNodes.NodeCnt(),"个节点")
fmt.Println("--------------------------------")
//插入新节点
LinkNodes.InsertNodeByIndex(2,"abc")
LinkNodes.ShowNodes()
//删除节点
fmt.Println("--------------------------------")
LinkNodes.DeleteNodeByIndex(3)
LinkNodes.ShowNodes()
//修改节点内容
fmt.Println("--------------------------------")
LinkNodes.UpdateNodeByIndex(3,"abc")
LinkNodes.ShowNodes()
}
输出内容为:
Hello World!
头节点
第一节点
第二节点
第三节点
第四节点
共有 5 个节点
--------------------------------
头节点
第一节点
abc
第二节点
第三节点
第四节点
--------------------------------
头节点
第一节点
第二节点
第三节点
第四节点
--------------------------------
头节点
第一节点
第二节点
abc
第四节点