自己动手用golang实现双向链表

  

双向链表

自己动手用golang实现双向链表


主要有链表跟节点2个结构体

Dnode struct类型{   数据接口{}   prev * Dnode   下一个* Dnode   }      DList struct类型{   头* Dnode   尾* Dnode   大小int   }




特点:

1,除头部,尾部2个节点外,其他任意节点都通过上一页/下一页分别指向前置后置节点

自己动手用golang实现双向链表

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实现双向链表