单链表是一种顺序存储的结构。
有一个头结点,没有值域,只有连域,专门存放第一个结点的地址。
有一个尾结点,有值域,也有链域,链域值始终为NULL。
所以,在单链表中为找第i个结点或数据元素,必须先找到第i - 1 结点或数据元素,而且必须知道头结点,否者整个链表无法访问。
代码实现
package main
import (
"fmt"
)
type PersonNode struct {
no int
name string
nickName string
next *PersonNode
}
//插入链表
// func InsertNode(head *PersonNode,newPersonNode *PersonNode) {
// //创建辅助节点
// temp := head
// for {
// if temp.next == nil {
// break
// }
// temp = temp.next
// }
// temp.next = newPersonNode
// }
//显示节点
func ShowNode(head *PersonNode) {
//创建辅助节点
temp := head
if temp.next == nil {
fmt.Println("空空如也")
return
}
for{
fmt.Printf("[%d,%s,%s] ==>",temp.next.no,temp.next.name,temp.next.nickName)
temp = temp.next
if temp.next == nil {
break
}
}
fmt.Println()
}
//插入有序节点
func InsertNode(head *PersonNode,newPersonNode *PersonNode) {
//创建辅助节点
temp := head
flag := true
for {
if temp.next == nil {
//说 明到链表的最后
break
} else if temp.next.no > newPersonNode.no {
//插入到temp后面
break
} else if temp.next.no == newPersonNode.no {
flag = false //说明链表中以存在该节点
break
}
temp = temp.next
}
if !flag {
fmt.Println("当前节点以存在",newPersonNode.no)
return
} else {
newPersonNode.next = temp.next
temp.next = newPersonNode
}
}
//删除节点
func DeleteNode(head *PersonNode,no int) {
//创建辅助节点
temp := head
flag := false
for{
if temp.next == nil { //到达链表的最后
break
} else if temp.next.no == no {
flag = true
break
}
temp = temp.next
}
if flag {
temp.next = temp.next.next
} else {
fmt.Println("没有要删除的节点")
}
}
func main() {
head := &PersonNode{}
person1 := &PersonNode{
no:1,
name:"张三",
nickName:"哈哈",
}
person2 := &PersonNode{
no:2,
name:"李四",
nickName:"嘿嘿",
}
person3 := &PersonNode{
no:3,
name:"王五",
nickName:"吱吱",
}
//插入
InsertNode(head,person3)
InsertNode(head,person1)
InsertNode(head,person2)
DeleteNode(head,2)
ShowNode(head)
}
结果
[1,张三,哈哈] ==>[3,王五,吱吱] ==>