571
社区成员
发帖
与我相关
我的任务
分享定义节点和链表结构体:
type ListNode struct {
Val interface{}
next *ListNode
lst *SingleList
}
type SingleList struct {
head *ListNode
len int
}
建立和初始化链表
//单链表初始化
func (lst *SingleList)Init(){
lst.head = new(ListNode)
lst.head.lst = lst
lst.len = 0
}
//创建单链表
func New() *SingleList {
lst := new(SingleList)
lst.Init()
return lst
}
清空链表
//清空链表
func (lst *SingleList)Clear(){
lst.Init()
}
查找
//返回第一个结点
func (lst *SingleList)Front() *ListNode {
return lst.head.Next()
}
//返回尾结点
func (lst *SingleList)Back() *ListNode {
if lst.len == 0{
return nil
}
cur := lst.head.Next()
for{
if cur.Next() == nil{
return cur
}
cur = cur.Next()
}
}
插入
//插入
func (lst *SingleList)insert(e, at *ListNode) *ListNode{
lst.len++
e.next = at.next
at.next = e
e.lst = lst
return e
}
//指定元素后插
func (lst *SingleList)InsertAfter(val interface{}, mark *ListNode) *ListNode {
if mark == nil{
return nil
}
if mark.lst == lst{
return lst.insert(&ListNode{Val:val},mark)
}
return nil
}
//尾插
func (lst *SingleList)PushBack(val interface{}) *ListNode{
end := lst.Back()
if end == nil{
return lst.InsertAfter(val,lst.head)
}else {
return lst.InsertAfter(val,end)
}
}
//头插
func (lst *SingleList)PushFront(val interface{}) *ListNode {
return lst.InsertAfter(val,lst.head)
}
删除
//删除
func (lst *SingleList)remove(e *ListNode) *ListNode{
nextOne := e.next
if nextOne == nil{
return nil
}
lst.len--
e.next = e.next.next
nextOne.lst = nil
return nextOne
}
遍历
//遍历
func (lst *SingleList)ShowList() {
for cur := lst.Front();cur!=nil;cur = cur.Next(){
fmt.Print(cur.Val," ")
cur = cur.Next()
}
fmt.Println()
}
长度
//单链表长度
func (lst *SingleList)Len() int {
return lst.len
}
git add.
git commit -m "commit说明"
git push -u origin main
上传成功
链接:https://github.com/hoay123/menu
作为go新手,第一次使用go写了一个完整的库,体会到了go语言本身的便利性
第二次上传github,比第一次熟练很多
链表虽然逻辑简单,但是写代码要考虑的情况比较多,需要仔细考虑
学号:413