golang数据结构和算法之DoublyLinkedList双向链表
双向链表比起单向链表,
多了一个向前指向的指针,
所以在增删查改时,要同时照顾到两个指针的指向。
DoublyLinkedList.go
package DoublyLinkedList //双向链表 type Node struct { data int next *Node prev *Node } type DoublyLinkedList struct { head *Node tail *Node } func (list *DoublyLinkedList) InsertFirst(i int) { data := &Node{data: i} if list.head != nil { list.head.prev = data data.next = list.head } list.head = data } func (list *DoublyLinkedList) InsertLast(i int) { data := &Node{data: i} if list.head == nil { list.head = data list.tail = data return } if list.tail != nil { list.tail.next = data data.prev = list.tail } list.tail = data } func (list *DoublyLinkedList) RemoveByValue(i int) bool { if list.head == nil { return false } if list.head.data == i { list.head = list.head.next list.head.prev = nil return true } if list.tail.data == i { list.tail = list.tail.prev list.tail.next = nil return true } current := list.head for current.next != nil { if current.next.data == i { if current.next.next != nil { current.next.next.prev = current } current.next = current.next.next return true } current = current.next } return false } func (list *DoublyLinkedList) RemoveByIndex(i int) bool { if list.head == nil { return false } if i < 0 { return false } if i == 0 { list.head.prev = nil list.head = list.head.next return true } current := list.head for u := 1; u < i; u++ { if current.next.next == nil { return false } current = current.next } if current.next.next != nil { current.next.next.prev = current } current.next = current.next.next return true } func (list *DoublyLinkedList) SearchValue(i int) bool { if list.head == nil { return false } current := list.head for current != nil { if current.data == i { return true } current = current.next } return false } func (list *DoublyLinkedList) GetFirst() (int, bool) { if list.head == nil { return 0, false } return list.head.data, true } func (list *DoublyLinkedList) GetLast() (int, bool) { if list.head == nil { return 0, false } current := list.head for current.next != nil { current = current.next } return current.data, true } func (list *DoublyLinkedList) GetSize() int { count := 0 current := list.head for current != nil { count += 1 current = current.next } return count } func (list *DoublyLinkedList) GetItemFromStart() []int { var items []int current := list.head for current != nil { items = append(items, current.data) current = current.next } return items } func (list *DoublyLinkedList) GetItemFromEnd() []int { var items []int current := list.tail for current != nil { items = append(items, current.data) current = current.prev } return items }
DoublyLinkedList_test.go
package DoublyLinkedList //使用随机数作测试 import ( "fmt" "math/rand" "testing" "time" ) func TestDoublyLinkedList(t *testing.T) { random := rand.New(rand.NewSource(time.Now().UnixNano())) headNode := &Node{ data: random.Intn(100), next: nil, prev: nil, } list := &DoublyLinkedList{ head: headNode, tail: headNode, } fmt.Println(list.GetItemFromStart()) list.InsertFirst(random.Intn(100)) fmt.Println(list.GetItemFromStart()) list.InsertLast(random.Intn(100)) fmt.Println(list.GetItemFromStart()) randNumber := random.Intn(100) list.InsertFirst(randNumber) fmt.Println(list.GetItemFromStart()) list.InsertLast(random.Intn(100)) fmt.Println(list.GetItemFromStart()) list.InsertFirst(random.Intn(100)) fmt.Println(list.GetItemFromStart()) fmt.Println(list.GetItemFromEnd()) if list.SearchValue(randNumber) == false { t.Fail() } list.RemoveByValue(randNumber) if list.SearchValue(randNumber) == true { t.Fail() } fmt.Println(list.GetFirst()) fmt.Println(list.GetLast()) fmt.Println(list.GetSize()) }
golang数据结构和算法之DoublyLinkedList双向链表的更多相关文章
- golang数据结构和算法之BinarySearch二分查找法
基础语法差不多了, 就需要系统的撸一下数据结构和算法了. 没找到合适的书, 就参考github项目: https://github.com/floyernick/Data-Structures-and ...
- 数据结构与算法-python描述-双向链表
# coding:utf-8 # 双向链表的相关操作: # is_empty() 链表是否为空 # length() 链表长度 # travel() 遍历链表 # add(item) 链表头部添加 # ...
- golang数据结构和算法之QueueLinkedList链表队列
队列和堆栈不一样的地方在于进出顺序: 堆栈是后进先出, 队列是先进先出. QueueLinkedList.go package QueueLinkedList type Node struct { d ...
- golang数据结构和算法之StackLinkedList链表堆栈
会了上一个,这个就差不离了. StackLinkedList.go package StackLinkedList type Node struct { data int next *Node } t ...
- golang数据结构和算法之StackArray数组堆栈
用数组实现的堆栈, 另一种,是用链表实现的堆栈, 在各种不同的编程语言上, 实现都是类似的. StackArray.go package StackArray //基于数组实现的堆栈 const ar ...
- golang数据结构和算法之LinkedList链表
差不多自己看懂了,可以自己写测试了.:) LinkedList.go package LinkedList //"fmt" type Node struct { data int ...
- golang数据结构和算法之CircularBuffer环形缓冲队列
慢慢练语法和思路, 想说的都在代码及注释里. CircularBuffer package CircularBuffer const arraySize = 10 type CircularBuffe ...
- 数据结构与算法 Big O 备忘录与现实
不论今天的计算机技术变化,新技术的出现,所有都是来自数据结构与算法基础.我们需要温故而知新. 算法.架构.策略.机器学习之间的关系.在过往和技术人员交流时,很多人对算法和架构之间的关系感 ...
- 数据结构和算法(Golang实现)(15)常见数据结构-列表
列表 一.列表 List 我们又经常听到列表 List数据结构,其实这只是更宏观的统称,表示存放数据的队列. 列表List:存放数据,数据按顺序排列,可以依次入队和出队,有序号关系,可以取出某序号的数 ...
随机推荐
- Oracle impdp导入数据临时表空间与undo表空间爆满解决实例
Oracle impdp导入数据临时表空间与undo表空间爆满解决实例 [日期:2018-01-24] 来源:Linux社区 作者:rangle [字体:大 中 小] 针对Oracle数据迁移, ...
- Python升级PIP
用pip list的时候.发现最后有两行黄颜色的.提示你可以用‘python -m pip install --upgrade pip’升级你的pip 当时我直接就复制粘贴上去运行了.但是报了一堆红的 ...
- 利用webpack打包自己的第一个Vue组件库
先说一下这篇文章的诞生原因.我们有一个这样的项目,类似或者说就是一个仪表板-Dashboard,其中的各个部分可能不是一个部门写的……我们需要提供拖拽布局(大小和位置)和展示的能力.要实现这样一个功能 ...
- 安装pymssql
直接安装失败 https://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql 去下载对应的 pymssql whl版本 之后 pip install whe ...
- [JavaScript]父子窗口间参数传递
概述 当页面嵌入一个iframe,或者打开一个子窗口.这个时候如果父窗口需要与子窗口之间通讯,如果直接用DOM访问对方窗口window,会受到跨于安全机制影响. javascript提供一个方法,可以 ...
- Ovirt 简单配置
Ovirt是一款开源的虚拟化平台管理 主要组成: 1.OvirtEngine Server 用于管理和分配资源 ,能通过web管理 2.Hosts 提供虚拟化功能,提供CPU资源和内存资源,用于分配给 ...
- MNIST 例程源码分析 TensorFlow 从入门到精通
按照上节步骤, TensorFlow 默认安装在 /usr/lib/python/site-packages/tensorflow/ (也有可能是 /usr/local/lib……)下,查看目录结构: ...
- 创建workbook及相关操作
通过openpyxl模块创建workbook时,无需本地事先创建好excel,它会直接创建一个新的excel文件 创建workbook时,会至少包含一个worksheet 注意:openpyxl模块只 ...
- jmeter进行接口测试--csv参数化,数据驱动-转
首先我们要有一个接口测试用例存放的地方,我们这里用EXCEL模板管理,里面包含用例编号.入参.优先级.请求方式.url等等. 1:新建一个txt文件,命名为sjqd,后缀名改为csv,右键excel格 ...
- 03-模板(过滤器,代码复用,表单,CSRF)
模块代码复用 在模板中,可能会遇到以下情况: 多个模板具有完全相同的顶部和底部内容 多个模板中具有相同的模板代码内容,但是内容中部分值不一样 多个模板中具有完全相同的 html 代码块内容 像遇到这种 ...