链表
链表(Linked list),是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。
每个节点包含下一个节点的地址,这样把所有的节点串起来了,通常把 链表中的第一个节点叫做链表头
单链表

package main
import (
"fmt"
)
type test struct {
name string
age uint8
intro string
next *test
}
func printList(str *test) {
for str != nil {
fmt.Println(*str)
str = str.next
}
}
func main() {
var test1 test
test1.name = "zhangsan"
test1.age = 123
test1.intro = "dasdasd"
var test2 test
test2.name = "lisi"
test2.age = 33
test2.intro = "dadasdasdsdasd"
test1.next = &test2
printList(&test1)
}

链表的头部插入
package main
import (
"fmt"
"math/rand"
)
type test struct {
name string
age int
intro string
next *test
}
func printlist(list *test) {
for list != nil {
fmt.Println(*list)
list = list.next
}
}
func insertTop(list *test) {
for n := 0; n < 10; n++ {
var student *test = &test{
name: fmt.Sprintf("stu_%d", n),
age: rand.Intn(100),
intro: fmt.Sprintf("stu_dasdasdas_%d", n),
}
student.next = list //将student的next插入到list之前,即stu.next=list
list = student //将stu赋值为list
// list.next = student.next
}
printlist(list)
}
func main() {
var stu *test = &test{
name: "lisi",
age: rand.Intn(100),
intro: "aaaaaaaaaaaaa",
}
insertTop(stu)
}

package main
import (
"fmt"
"math/rand"
)
type test struct {
name string
age int
intro string
next *test
}
func printlist(list *test) {
for list != nil {
fmt.Println(*list)
list = list.next
}
}
func insertTop(list **test) { //指针的指针
for n := 0; n <= 10; n++ {
var student *test = &test{
name: fmt.Sprintf("stu_%d", n),
age: rand.Intn(100),
intro: fmt.Sprintf("stu__%d", n),
}
student.next = *list
*list = student
}
}
func main() {
var stu *test = &test{
name: "lisi",
age: rand.Intn(100),
intro: "啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊",
}
insertTop(&stu)
printlist(stu)
}

尾部插入
package main
import (
"fmt"
"math/rand"
)
type test struct {
name string
age int
intro string
next *test
}
func printlist(list *test) {
for list != nil {
fmt.Println(*list)
list = list.next
}
}
func insertTail(list *test) {
var test1 = list
for n := 0; n <= 10; n++ {
student := test{
name: fmt.Sprintf("stu_%d", n),
age: rand.Intn(100),
intro: fmt.Sprintf("stustustustustustustu%d", n),
}
test1.next = &student
test1 = &student
}
}
func main() {
var stu = test{
name: "zhangsan",
age: 16,
intro: "zhangsanlisi",
}
insertTail(&stu)
fmt.Println(&stu)
}