本篇文章我们用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. 企业级GitLab在Docker部署使用

    一.部署gitlab 这里使用的是Centos8,安装Docker环境 ,这里不说了,参考:https://www.cnblogs.com/wei325/p/15139701.html gitlab有 ...

  2. P23_列表渲染

    列表渲染 wx:for 通过 wx:for 可以根据指定的数组,循环渲染重复的组件结构,语法示例如下: 默认情况下,当前循环项的索引用 index 表示:当前循环项用 item 表示. 手动指定索引和 ...

  3. gitbook使用指南

    一. node 下载 不要去node官网下载,那是最新版的,官方没提供旧版node.如果下载了最新版的还得下载一个管理node版本的工具,很麻烦且没必要. 在这个网站下载node:https://no ...

  4. JZOJ 3570. 【GDKOI2014】壕壕的寒假作业

    解析 这道题比较水. 求最快什么时候做完作业? 如果要最快完成第i份作业,那么是i的前继那些作业都要完成之后才能够完成i,所以,为了尽快完成i,我们要把i的前继的作业全部先做完. 最慢什么时候做完作业 ...

  5. CCRD_TOC_2008年第3期

    中信国健临床通讯 2008年第3期 目 录   银屑病和银屑病关节炎 1.        国际皮肤病专家呼吁重视生物制剂治疗银屑病 原文: http://pharmatimes.com/forums/ ...

  6. python中的字符串的常用方法介绍

    a = "alxe Li 金角大王"     #创建一个字符串来演示方法的功能结果.一下都使用这个字符串演示. 首先要了解的常识性的知识点是:字符串是不可变的序列.所有对字符串的内 ...

  7. C#的闭包捕获变量与英语中Nice to meet you的联系

    看标题有种"意大利面与42号混凝土"放在一起说的感觉,实际上,就是. 闭包捕获变量 我们都知道在C#里,闭包捕获的是变量,而不是变量值本身 每个Task在运行的时候,发现i的值是3 ...

  8. LeetCode-838 推多米诺

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/push-dominoes 题目描述 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时 ...

  9. Notepad++来比较文件

    使用Notepad++来比较文件_sanqima的专栏-CSDN博客_notepad比较文件https://blog.csdn.net/sanqima/article/details/50467154

  10. Java面向对象之回顾方法及加深

    回顾方法及加深 方法的定义 修饰符 返回类型 break和return的区别 1.break:跳出switch,结束循环 2.return:代表方法结束,返回一个结果 方法名:注意规范.见名知意 参数 ...