双向链表
主要有链表跟节点2个结构体
Dnode struct类型{ 数据接口{} prev * Dnode 下一个* Dnode } DList struct类型{ 头* Dnode 尾* Dnode 大小int }
特点:
1,除头部,尾部2个节点外,其他任意节点都通过上一页/下一页分别指向前置后置节点
2,头部节点前置节点为空,同理尾部节点后置节点为空
主要实现的API如下:
1,查询
查询链表长度
查询任意节点
2,添加
从开头插入节点
从尾部插入节点
从任意位置插入节点
3,删除
删除任意节点
4,其他
打印链表
初始化链表
具体实现如下:
包主要 进口“fmt” Dnode struct类型{ 数据接口{} prev * Dnode 下一个* Dnode } DList struct类型{ 头* Dnode 尾* Dnode 大小int }//获取链表长度 int func (dl * DList) getSize () { 返回dl.size }//获取链表头部 func (dl * DList) getHead () * Dnode { 返回dl.head }//获取链表尾部 func (dl * DList) getTail () * Dnode { 返回dl.tail }//初始化链表 func initDList () (dl * DList) { 返回,DList { 头:nil, 尾巴:nil, 大小:0, } }//打印链表 func (dl * DList)显示(){ fmt。Println (“DoubleLinkedList大小”,dl.size) 如果dl.getSize ()==0 { 返回 } ptr:=dl.head ptr !=nil { fmt。Println(“数据”,ptr.data) ptr=ptr.next } }//在头部追加节点 func (dl * DList) addHeadNode(节点* Dnode) { 如果dl.getSize ()==0 { dl。头=节点 dl。尾=节点 节点。prev=nil 节点。下一个=nil 其他}{ dl.head。prev=节点 节点。prev=nil 节点。下一个=dl.head dl。头=节点 } dl。大小+=1 }//在尾部追加节点 func (dl * DList)追加(节点* Dnode) { 如果dl.getSize ()==0 { dl。头=节点 dl。尾=节点 节点。prev=nil 节点。下一个=nil 其他}{ dl.tail。下一个=节点 节点。prev=dl.tail 节点。下一个=nil dl。尾=节点 } dl。大小+=1 }//增加任意节点 func (dl * DList)插入(节点* Dnode指数int) { 如果dl.getSize ()==0 { dl.addHeadNode(节点) }//获取当前索引为索引值的节点 oldNode:=dl.getNode(指数) 节点。下一个=oldNode 节点。prev=oldNode.prev oldNode.prev。下一个=节点 oldNode。prev=节点 dl。大小+ + }//查询节点 func (dl * DList) getNode(索引int) (dnode * dnode) { 如果dl.getSize()==0 | |指数比;dl.getSize () { 返回nil } 如果指数==0 { 返回dl.head } 节点:=dl.head 我:=0;i<=指数;我+ + { dnode=node.next } 返回 }//任意节点删除 func (dl * DList)删除(节点* Dnode) {//默认删除尾部节点 如果节点==nil | |节点==dl.tail { 节点=dl.tail dl。尾=node.prev dl.tail。下一个=nil==dl.head {} else if节点 dl。头=node.next dl.head。prev=nil 其他}{ node.prev。下一个=node.next node.next。prev=node.prev } dl。大小, } 函数main () { dl:=initDList () fmt.Println(“从开头添加节点”) 我:=0;i<5,我+ + { dnode:=dnode { 数据:我, } dl.addHeadNode(及dnode) } dl.display () fmt.Println(“从末尾添加节点”) 我:=5;i<10;我+ + { dnode:=dnode { 数据:我, } dl.append(及dnode) } dl.display () fmt.Println(“删除最后一个节点”) dl.remove(零) dl.display () fmt.Println(“删除第3个节点”) 节点:=dl.getNode (3) dl.remove(节点) dl.display () fmt.Println(“添加第2个节点”) 节点=,Dnode { 数据:3, } dl.insert(节点,1) dl.display () }自己动手用golang实现双向链表