概念:
链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
图解:

图中element存储当前节点的数据,next指向下一个节点的指针
代码实现:
package LinkedNodes
import "fmt"
var head *Node //头节点
var curr *Node //当前节点
//创建结构体,用以申明每个节点
type Node struct {
data string //数据信息
NextNode *Node //下一个节点的地址
}
//创建头节点
func CreateHeadNode(data string) *Node{
//创建Node头节点
var node *Node = new(Node)
//封装数据
node.data = data
//指定下一个节点地址,因为还没添加所以是nil
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
//fmt.Println(curr)
return newNode
}
//遍历当前链表
func ShowNodes(){
var n = head
for {
if n.NextNode != nil{
fmt.Println(n.data)
n = n.NextNode
}else {
fmt.Println(n.data)
break
}
}
}
//计算节点个数
func NodeCount ()int{
var n = head
var flag int //临时存储节点个数变量
for {
if n.NextNode != nil{
flag+=1
//fmt.Println(n.data)
n = n.NextNode
}else {
flag+=1
//fmt.Println(n.data)
break
}
}
//fmt.Println("节点个数是:",flag)
return flag
}
//添加节点 这里需要两个参数,第一个,从第几个节点开始增加,指定下角标
func InsertNodeIndex (index int,data string){
//需要做判断,针对不同情况做添加节点的操作
//头节点
if index == 0 {
var node *Node = new(Node)
node.data = data
//指定头地址
node.NextNode = head
//当前节点赋给头
head = node
}else if index > NodeCount()-1{
//添加到末尾,直接调用方法
AddNode(data)
}else{
//添加到中间
var n = head
for i := 0 ; i < index-1 ; i++ {
n = n.NextNode
}
var node *Node = new(Node)
node.data = data
node.NextNode = n.NextNode
n.NextNode = node
}
}
//修改节点
func UpdateNodeByIndex(index int,data string){
//头节点
if index == 0 {
head.data = data
}else if index > NodeCount() - 1{
fmt.Println("角标越界")
return
}else{
//添加到中间
var n = head
for i := 0 ; i < index ; i++ {
n = n.NextNode
}
n.data = data
}
}
//删除节点
func DelNode(index int){
//头节点
if index == 0 {
//删除头节点,下一个节点就是头节点
head = head.NextNode
}else if index > NodeCount() - 1{
fmt.Println("角标越界")
return
}else{
//添加到中间
var n = head
for i := 0 ; i < index - 1 ; i++ {
n = n.NextNode
}
n.NextNode = n.NextNode.NextNode
}
}
测试
package main
import (
"MyHashMap/LinkedNodes"
)
//程序入口,主执行
func main () {
//创建头节点
LinkedNodes.CreateHeadNode("顶级节点")
//向节点中添加数据
LinkedNodes.AddNode("节点二")
LinkedNodes.AddNode("节点三")
LinkedNodes.AddNode("节点四")
//LinkedNodes.AddNode("节点五")
//添加节点
LinkedNodes.InsertNodeIndex(0,"新增节点")
//修改节点信息
LinkedNodes.UpdateNodeByIndex(4,"最小的节点")
//删除节点
LinkedNodes.DelNode(5)
//遍历链表
LinkedNodes.ShowNodes()
//计算节点个数
LinkedNodes.NodeCount()
}
网友评论