链表
链表(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) }