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:存放数据,数据按顺序排列,可以依次入队和出队,有序号关系,可以取出某序号的数 ...
随机推荐
- Internet Download Manager是什么?
在互联网下载管理器(也被称为IDM)是一款共享软件下载管理器,这意味着你可以下载该程序,并尝试它的试用期内免费. 以下是IDM最佳功能的列表: 支持多种浏览器和应用程序 一键下载文件 内置防病毒检查 ...
- Jenkins实现单一安卓项目打包多个module填坑实录
今天接手一个任务,已有项目结构上新添加了一个module,这个module打包工作需要在Jenkins上添加一个方便测试点击的打包工程 因为之前已有现成的打包工程,我直接新建了一个工程并且复制原有工程 ...
- java 反编译工具 jd-gui
下载地址 http://java-decompiler.github.io/ 一般使用windows 版本 看你使用的操作系统了 解压 点击exe 进入 选择你编译后的cla ...
- 【使用篇二】SpringBoot使用JdbcTemplate操作数据库(12)
Spring对数据库的操作在jdbc上面做了深层次的封装,提供了JdbcTemplate模板. 在SpringBoot使用JdbcTemplate很简单: 引入数据库驱动包(mysql或oracle) ...
- 剑指Offer-30.连续子数组的最大和(C++/Java)
题目: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中 ...
- 利用 ROW_NUMBER() OVER ( ORDER BY 进行选择性排序,按不同字段进行排序处理,分页
--就在OVER order by 中用case语句进行判断. IF ( OBJECT_ID('tempdb..#TempTable') IS NOT NULL ) DROP TABLE #TempT ...
- codeforces 1260C. Infinite Fence (数学or裴蜀定理)
只需要验证小间隔在大间隔之间有没有连续的k个 设小间隔为a,大间隔为b,那么a在b之间出现的次数在\(\lfloor \frac{b}{a}\rfloor\)或者\(\lfloor \frac{b}{ ...
- [ Python入门教程 ] Python生成随机数模块(random)使用方法
1.使用randint(a,b)生成指定范围内的随机整数.randint(a,b)表示从序列range([a,b])中获取一个随机数,包括b. >>> random.randint( ...
- 【转】 java常量池
理论 jvm虚拟内存分布: 程序计数器是jvm执行程序的流水线,存放一些跳转指令. 本地方法栈是jvm调用操作系统方法所使用的栈. 虚拟机栈是jvm执行java代码所使用 ...
- React: React的复合组件
一.介绍 不论Web界面是多么的复杂,它都是由一个个简单的组件组合起来实现的,既然会创建一个简单的组件,那么复杂的组件就有了下手的切入点了.现在来实现一个简单的复合组件.一个颜色面板,一共三部分组成. ...