自己动手用golang实现双向链表-创新互联
双向链表
创新互联长期为1000多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为万年企业提供专业的网站建设、成都做网站,万年网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。主要有链表跟节点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() }另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
当前文章:自己动手用golang实现双向链表-创新互联
网页URL:http://lswzjz.com/article/dcdeeg.html