链表是有序的列表
为了更好的对单链表进行操作,都要设置一个头节点,头节点的主要作用是用来标识链表头,本身这个节点不存放数据

例子

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)
}