河北网站备案查询系统,网站制作 php,我要表白网app,贵州省住房和城乡建设厅网站(链表的前提
GO语言的链表类似于C语言的链表#xff0c;它通过结构体和结构体指针实现。
结构体
GO语言定义结构体如下
type user struct {name stringage intnext *user
}
结构体指针
结构体指针就是指向结构体的指针#xff0c;我们在链表中会用到结构体指针实现链…链表的前提
GO语言的链表类似于C语言的链表它通过结构体和结构体指针实现。
结构体
GO语言定义结构体如下
type user struct {name stringage intnext *user
}
结构体指针
结构体指针就是指向结构体的指针我们在链表中会用到结构体指针实现链表节点之间的连接 next *user 就是结构体指针
构建链表
构建链表需要三点头节点尾节点中间节点 头节点的作用相当于链表的入口尾节点用来表示节点的结尾中间节点用于存储信息 创建头节点
head : user{}
//此时的head 类型是*user
插入节点 1.尾插法
func insert_end(head *user, name string, age int) *user {new_user : user{name, age, nil}p : headfor {if p.next ! nil {p p.next}break} //循环结束后p指向最后一个节点p.next new_userreturn head
}
为什么new_user : user{name, age, nil}创建一个结构体指针 而不是创建一个结构体变量
如果我们直接创建一个结构体变量那它的类型就是user由因为我们是在insert_end函数里面创建的这个变量所以它的生命周期只有在这个函数里面存在。并且我们在接入节点的时候p.next new_user就会报错我们就需要改成p.next new_user。但是当我们的函数结束的时候new_user 就会被销毁p.next就会指向一个已经被销毁的内存。但是我们使用new_user : user{name, age, nil}的时候虽然user会随着函数结束而销毁但是这个内存由于被链表引用所以会一直存在。
尾插法的核心点在于寻找尾节点并让尾节点的next指向新节点
2.头插法
func insert_head(head *user, name string, age int) *user {p : head.nextnew_user : user{name, age, nil}head.next new_usernew_user.next preturn head
}
最后返回head是保证外部的head结构正确。我们在insert_head函数里面的head并不是main函数里面的head他只是一个副本我们需要副本覆盖掉原来的。所以需要return head副本
3.中插法指定插入到某个节点之前 func insert_body(head *user, name string, age int, key string) *user {new_user : user{name, age, nil}p : headp2 : head.nextfor p2 ! nil {if p2.name key {p.next new_usernew_user.next p2return head}p p2p2 p2.next}// 如果循环结束都没有找到则输出错误信息fmt.Println(插入错误没找到对应的节点)return head
}
在这个方法中我们需要确定当前节点的下一个节点是否是我们需要插入到它之前的节点。如果是的话就让当前节点的next指向新节点新节点的next指向原下一节点。 链表的删除
func delete(head *user, key string) *user {p : headp2 : head.nextfor p2 ! nil {if p2.name key {p.next p2.next}p p2p2 p2.next}return head
}删除的主要点在于让上一节点直接指向被删除节点的next掠过这个节点。被删除节点由于无人引用就会自动回收
链表的遍历
func bianli(head *user) {p : head.nextfor {if p ! nil {fmt.Println(p.name, p.age)} else {break}p p.next}
}
遍历只需要一个头节点不断循环下去一直循环到nil为止然后输出对应节点的信息