本篇文章我们用Go封装一个介入式的双向链表,目的是将链表的实现和具体元素解耦。文章参考自:https://github.com/brewlin/net-protocol

1.元素的接口

type Element interface {
Next() Element
Prev() Element
SetNext(Element)
SetPrev(Element)
}

2.链表的封装

type List struct {
head Element
tail Element
}

3.链表的操作

// Reset 清空List
func (l *List) Reset() {
l.head = nil
l.tail = nil
} // Empty 判断List是否为空
func (l *List) Empty() bool {
return l.head == nil
} // Front 返回第一个元素
func (l *List) Front() Element {
return l.head
} // Back 返回最后一个元素
func (l *List) Back() Element {
return l.tail
} // PushFront 插入元素到列头
func (l *List) PushFront(e Element) {
e.SetNext(l.head)
e.SetPrev(nil) if l.head != nil {
l.head.SetPrev(e)
} else {
l.tail = e
} l.head = e
} // PushBack 插入元素到列尾
func (l *List) PushBack(e Element) {
e.SetNext(nil)
e.SetPrev(l.tail) if l.tail != nil {
l.tail.SetNext(e)
} else {
l.head = e
} l.tail = e
} // PushBackList 插入一个list到列尾,并清空这个list
func (l *List) PushBackList(m *List) {
if l.head == nil {
l.head = m.head
l.tail = m.tail
} else if m.head != nil {
l.tail.SetNext(m.head)
m.head.SetPrev(l.tail) l.tail = m.tail
} m.head = nil
m.tail = nil
} // InsertAfter 在b后插入e
func (l *List) InsertAfter(b, e Element) {
a := b.Next()
e.SetNext(a)
e.SetPrev(b)
b.SetNext(e) if a != nil {
a.SetPrev(e)
} else {
l.tail = e
}
} // InsertBefore 在a前插入e
func (l *List) InsertBefore(a, e Element) {
b := a.Prev()
e.SetNext(a)
e.SetPrev(b)
a.SetPrev(e) if b != nil {
b.SetNext(e)
} else {
l.head = e
}
} // Remove 移除e
func (l *List) Remove(e Element) {
prev := e.Prev()
next := e.Next() if prev != nil {
prev.SetNext(next)
} else {
l.head = next
} if next != nil {
next.SetPrev(prev)
} else {
l.tail = prev
}
}

4.元素接口的实现

type Entry struct {
next Element
prev Element
} func (e *Entry) Next() Element {
return e.next
} func (e *Entry) Prev() Element {
return e.prev
} func (e *Entry) SetNext(elem Element) {
e.next = elem
} func (e *Entry) SetPrev(elem Element) {
e.prev = elem
}

5.使用示例

我们只需在结构体中用匿名字段继承Entry,就可以将其作为链表上的元素进行插入删除操作。

type Card struct {
Entry
num int
} func main() {
var list List
for i := 0; i < 10; i++ {
list.PushBack(&Card{num:i})
} for !list.Empty() {
e := list.Front()
fmt.Println(e.(*Card).num)
list.Remove(e)
}
}

Go组件库总结之介入式链表的更多相关文章

  1. 免费开源的 .NET 分布式组件库 Exceptionless Foundatio

    前言 在互联网时代,分布式应用.系统变得越来越多,我们在使用 .Net 技术构建分布式系统的时候,需要使用到一些组件或者是助手库来帮助我们提高生产力以及应用程序解耦,但是纵观.Net圈,能够符合要求的 ...

  2. RSuite 一个基于 React.js 的 Web 组件库

    RSuite http://rsuite.github.io RSuite 是一个基于 React.js 开发的 Web 组件库,参考 Bootstrap 设计,提供其中常用组件,支持响应式布局. 我 ...

  3. C++侵入式链表

    C++标准模板库中的list是非侵入式的链表,当我们通过对象来删除容器中的对象时,需要从头到尾查找一次得到iterator,最后通过iterator来删除对象.这样删除容器中的对象时比较缓慢,所以就实 ...

  4. Web移动端的常用组件库

    normalize http://necolas.github.io/normalize.css/ 最受欢迎的css reset 保留有用的默认值,这个区别于其他的CSS resets 标准化大范围的 ...

  5. 16款优秀的Vue UI组件库推荐

    16款优秀的Vue UI组件库推荐 Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可.在公司的Web前端项目开发中,多个项目采用基 ...

  6. Vue2.0+组件库总结

    转自:https://blog.csdn.net/lishanleilixin/article/details/84025459 UI组件 element - 饿了么出品的Vue2的web UI工具套 ...

  7. 转:Vue2.0+组件库总结

    UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开 ...

  8. 前端组件库 - 搭建web app常用的样式/组件等收集列表(移动优先)

    0. 前端自动化(Workflow) 前端构建工具 Webpack - module bundler Yeoman - a set of tools for automating developmen ...

  9. 七个不可错过的React组件库与开发框架

    React是如今最火爆的前端技术,而React最棒的一个特点就是有大量功能丰富的组件库和开发框架可用.从按钮到卷轴到工具条,应有尽有,而且这些组件可以各行其是,也可以组装成复杂的UI,你也可以把UI分 ...

  10. [转载]前端——实用UI组件库

    https://www.cnblogs.com/xuepei/p/7920888.html Angular UI 组件 ngx-bootstrap 是一套Bootstrap 组件 官网:https:/ ...

随机推荐

  1. 一个容器,但是一整个k8s集群

    你可能需要一个快速启动和销毁的 k8s 集群:你可能在资源受限的环境中运行 k8s 集群:你可能是一个完全的初学者,觉得搭建完整的 k8s 套件太难.那么这篇短文可能可以帮到你. 各种丐版 k8s 集 ...

  2. Linux07-常用命令-权限

    1.组 1.1基本说明 在linux中的每个用户必须属于一个组,不能独立于组外.在linux中每个文件有所有者.所在组.其它组的概念. 1) 文件所有者 谁创建的这个文件,文件的所有者就是谁 2) 文 ...

  3. UBUNTU切换内核

    查询可更换内核的序号    gedit /boot/grub/grub.cfg查询已安装的内核和内核的序号.找到文件中的menuentry (图中在一大堆fi-else底下)menuentry底下还有 ...

  4. 华为eNSP 基础企业级WLAN配置

    目标:STA可以扫描并连接到两个ssid,STA可以ping通ip:200.200.200.200 步骤:1 实现AP与AC之间的连通性.     2 在AC上配置与WLAN相关的各项参数 3 把AP ...

  5. C语言小程序-天天酷跑类游戏 26号完成

    1.创建游戏内背景 2.实现人物 奔跑 跳跃 优化帧 3.障碍物 出现 https://kxd.lanzoul.com/iKXU20elmtah 开源地址 半成品

  6. LeetCode ● 216.组合总和III ● 17.电话号码的字母组合

    LeetCode 216.组合总和III 分析1.0 回溯问题 组合总和sum == n 时以及path中元素个数 == k 时,res.add(new path) 返回后递归删除掉当前值 class ...

  7. 【论文笔记】UNet

    语义分割的U-Net网络结构Unet是2015年诞生的模型,它几乎是当前segmentation项目中应用最广的模型.Unet能从更少的训练图像中进行学习,当它在少于40张图的生物医学数据集上训练时, ...

  8. vue弹窗后如何禁止滚动条滚动

    toggleBody(isPin){ if(isPin){ document.body.style.height = '100vh' document.body.style['overflow-y'] ...

  9. ASP.NET Core - 依赖注入(四)

    4. ASP.NET Core默认服务 之前讲了中间件,实际上一个中间件要正常进行工作,通常需要许多的服务配合进行,而中间件中的服务自然也是通过 Ioc 容器进行注册和注入的.前面也讲到,按照约定中间 ...

  10. Hive数仓基础

    架构图: 组成:SQL语句到任务执行需要经过解释器,编译器,优化器,执行器 解释器:调用语法解释器和语义分析器将SQL语句转换成对应的可执行的java代码或业务代码 ​ 编译器:将对应的java代码转 ...