使用go写一个链表库

ryannas 2022-04-07 00:16:39

使用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

在GitHub创建仓库,在本地项目文件夹使用git init命令初始化仓库,并添加远程仓库,最后push。

仓库地址为ryannas/LinkListProject (github.com)

学号:579

...全文
127 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

571

社区成员

发帖
与我相关
我的任务
社区描述
软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧