571
社区成员
发帖
与我相关
我的任务
分享使用go来写一个链表库,其基本功能应包括初始化、添加节点、删除结点等。
结点定义如下。
type Node struct {
data int
next *Node
}
链表定义如下。其中仅包含一个头结点,表明这是一个单链表。
type List struct {
length int
head *Node
}
链表初始化即创建一个头结点,并返回指向链表对象的指针。
func InitList() *List {
node := new(Node)
L := new(List)
L.head = node
return L
}
在链表头插入一个结点,同时为了保证代码的鲁棒性,考虑用户不调用初始化函数就直接调用头插的情况。
func (list *List) PushFront(v int) {
node := &Node{data: v}
if list.IsNull() {
list.head = node
list.length++
return
}
node.next = list.head
list.head = node
list.length++
return
}
在链表尾部插入一个函数,每次需要从头结点开始遍历,直到找到链表尾,再在链表尾部插入新结点。可以考虑存储一个链表尾结点,来提高尾插的效率。
func (list *List) PushBack(v int) {
node := &Node{data: v}
if list.IsNull() {
list.head.next = node
} else {
cur := list.head
for cur.next != nil {
cur = cur.next
}
cur.next = node
}
list.length++
return
}
输入一个索引,删除指定索引的结点。首先会判断索引是否合法,如果合法就删除对应结点。
func (list *List) Delete(index int) {
if index <= 0 || index > list.length {
fmt.Println("err")
return
} else {
pre := list.head
if index == 1 {
list.head = pre.next
} else {
pre := list.head
for count := 1; count < index-1; count++ {
pre = pre.next
}
pre.next = pre.next.next
}
list.length--
}
}
删除链表中指定值的结点。
func (list *List) Remove(v int) {
pre := list.head
if pre.data == v {
list.head = pre.next
fmt.Println("ok")
} else {
for pre.next != nil {
if pre.next.data == v {
pre.next = pre.next.next
fmt.Println("ok")
return
} else {
pre = pre.next
}
}
fmt.Println("fail")
return
}
}
项目的结构如下:
LinkListProject
|____LinkList
|____LinkList.go
|____main.go
以上链表实现都在LinkList.go中,在该文件夹之外创建main.go,用于测试链表库。
main.go的主要内容如下,主要测试链表的各种插入删除的功能。
package main
import (
"LinkListProject/LinkList"
"fmt"
)
func main() {
// 初始化链表
list := LinkList.InitList()
// 添加链表结点
fmt.Println("添加结点")
list.PushBack(1)
list.PushBack(2)
list.PushBack(3)
list.Insert(3, 4)
list.ShowList()
// 按索引删除链表结点
fmt.Println("删除索引为1的结点")
list.Delete(1)
list.ShowList()
// 按值删除链表结点
fmt.Println("删除值为1的结点")
list.Remove(1)
list.ShowList()
}
运行结果如下

在GitHub创建仓库,在本地项目文件夹使用git init命令初始化仓库,并添加远程仓库,最后push。
仓库地址为ryannas/LinkListProject (github.com)
学号:579