GO 模拟单链表代码简单实现

概念:

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

图解:

GO 模拟单链表代码简单实现_第1张图片
单链表.png

图中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()
}

你可能感兴趣的:(GO 模拟单链表代码简单实现)