单链表是一种顺序存储的结构。
有一个头结点,没有值域,只有连域,专门存放第一个结点的地址。
有一个尾结点,有值域,也有链域,链域值始终为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,王五,吱吱] ==>