成都网站建设设计

将想法与焦点和您一起共享

自己动手用golang实现双向链表-创新互联

双向链表

创新互联长期为1000多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为万年企业提供专业的网站建设、成都做网站万年网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。

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

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

type Dnode struct {    data interface{}    prev *Dnode    next *Dnode } type  DList struct {    head *Dnode    tail *Dnode    size int }

特点:

1、除头部、尾部2个节点外,其他任意节点都通过prev / next 分别指向前置后置节点

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

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() }

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前文章:自己动手用golang实现双向链表-创新互联
文章分享:http://chengdu.cdxwcx.cn/article/dcdeeg.html