自己动手用golang实现双向链表
2019-12-15 20:11
1476 查看
双向链表
主要有链表跟节点2个结构体
type Dnode struct { data interface{} prev *Dnode next *Dnode } type DList struct { head *Dnode tail *Dnode size int }
特点:
1、除头部、尾部2个节点外,其他任意节点都通过prev / next 分别指向前置后置节点
2、头部节点前置节点为空,同理尾部节点后置节点为空
主要实现的API如下:
1、查询
查询链表长度
查询任意节点
2、添加
从开头插入节点
从尾部插入节点
从任意位置插入节点
3、删除
删除任意节点
4、其他
打印链表
初始化链表
具体实现如下:
package main import "fmt" type Dnode struct { data interface{} prev *Dnode next *Dnode } type DList struct { head *Dnode tail *Dnode size int } // 获取链表长度 func (dl *DList)getSize()int{ return dl.size } // 获取链表头部 func (dl *DList)getHead() *Dnode{ return dl.head } // 获取链表尾部 func (dl *DList)getTail() *Dnode{ return dl.tail } // 初始化链表 func initDList()(dl *DList){ return &DList{ head:nil, tail:nil, size:0, } } // 打印链表 func (dl *DList) display(){ fmt.Println("DoubleLinkedList size is ",dl.size) if dl.getSize() == 0{ return } ptr := dl.head for ptr != nil{ fmt.Println("data is ",ptr.data) ptr = ptr.next } } // 在头部追加节点 func (dl *DList) addHeadNode(node *Dnode){ if dl.getSize() == 0{ dl.head = node dl.tail = node node.prev = nil node.next = nil }else{ dl.head.prev = node node.prev = nil node.next = dl.head dl.head = node } dl.size += 1 } // 在尾部追加节点 func (dl *DList) append(node *Dnode){ if dl.getSize() == 0 { dl.head = node dl.tail = node node.prev = nil node.next = nil }else{ dl.tail.next = node node.prev = dl.tail node.next = nil dl.tail = node } dl.size += 1 } // 增加任意节点 func (dl *DList) insert(node *Dnode,index int){ if dl.getSize() == 0 { dl.addHeadNode(node) } // 获取当前索引为index 值的节点 oldNode := dl.getNode(index) node.next = oldNode node.prev = oldNode.prev oldNode.prev.next = node oldNode.prev = node dl.size ++ } // 查询节点 func (dl *DList) getNode(index int)(dnode *Dnode){ if dl.getSize() == 0 || index > dl.getSize() { return nil } if index == 0{ return dl.head } node := dl.head for i:=0;i<=index;i++{ dnode = node.next } return } // 任意节点删除 func (dl *DList) remove(node *Dnode) { // 默认删除尾部节点 if node == nil || node == dl.tail{ node = dl.tail dl.tail = node.prev dl.tail.next = nil }else if node == dl.head{ dl.head = node.next dl.head.prev = nil }else{ node.prev.next = node.next node.next.prev = node.prev } dl.size -- } func main() { dl := initDList() fmt.Println("从开头添加节点") for i:=0;i<5;i++{ dnode := Dnode{ data:i, } dl.addHeadNode(&dnode) } dl.display() fmt.Println("从末尾添加节点") for i:=5;i<10;i++{ dnode := Dnode{ data:i, } dl.append(&dnode) } dl.display() fmt.Println("删除最后一个节点") dl.remove(nil) dl.display() fmt.Println("删除第3个节点") node := dl.getNode(3) dl.remove(node) dl.display() fmt.Println("添加第2个节点") node = &Dnode{ data:3, } dl.insert(node,1) dl.display() }
相关文章推荐
- 自己实现C语言双向向链表
- Java自己实现双向链表LinkList
- [golang]自己动手实现ini文件读取
- 自己动手实现java数据结构(二) 链表
- 容器第四课,JDK源代码分析,自己实现LinkedList,双向链表的概念_节点定义
- 自己动手构建无锁的并发容器(续篇)——基于单向链表实现的无锁队列
- Java自己实现双向链表LinkList
- 自己动手写分词引擎——逆向最大、正向最大、双向最大分词算法的实现
- C 双向链表的实现
- C++ 学习练手 - 双向链表的模板实现
- 自己动手写类似酷狗播放器(2)_音乐播放模块实现
- java实现双向链表
- C语言实现双向链表之ADT定义
- java数据结构--循环双向链表的实现
- 【代码】模板实现双向链表的去重、拼接、合并、排序
- 自己动手系列——实现一个简单的LinkedList
- C语言双向链表实现根据使用频率安排元素位置的功能实例代码
- 自己动手实现一个Android Studio插件
- 双向链表的基本操作实现
- 静态双向链表的多数组实现