链表是有序的列表
为了更好的对单链表进行操作,都要设置一个头节点,头节点的主要作用是用来标识链表头,本身这个节点不存放数据
例子
type PersonNode struct {
id int
name string
next *PersonNode //表示指向下一个节点
}
//给链表添加一个节点,根据id从小到大插入
func Insert(head *PersonNode, newNode *PersonNode) {
//1.先找到链表的适当节点
//2.创建一个辅助节点
temp := head
flag := true
//比较插入的节点和temp的下一个节点
for {
if temp.next == nil { //如果没有下一个节点,直接添加到头节点后面
break
} else if temp.next.id > newNode.id { //如果第一个节点id比新节点大,添加新节点到头节点后面,也就是第一个节点的前面
break
} else if temp.next.id == newNode.id {
flag = false
break
}
temp = temp.next
}
if !flag {
fmt.Println("error = same id")
} else {
newNode.next = temp.next
temp.next = newNode
}
//3.将newNode加入到链表最后
temp.next = newNode
}
//显示链表所有节点
func ListNodes(head *PersonNode) {
//1.创建一个辅助节点
temp := head
//2.判断链表是否为空
if temp.next == nil {
fmt.Println("empty list")
return
}
//3.遍历链表
for {
fmt.Printf("[%d, %s]->", temp.next.id, temp.next.name)
temp = temp.next
if temp.next == nil {
break
}
}
}
func main() {
//创建一个头节点
head := &PersonNode{}
//创建新的PersonNode
person1 := &PersonNode{
id: 1,
name: "Kyle",
}
person2 := &PersonNode{
id: 2,
name: "Harry",
}
person3 := &PersonNode{
id: 3,
name: "Tim",
}
Insert(head, person3)
Insert(head, person1)
Insert(head, person2)
ListNodes(head)
}