直接上代码,里面主要是使用了capaticy控制容量
package utils
import (
"fmt"
"sync"
)
type DoubleNode struct {
Data interface{} //节点数据
PreNode *DoubleNode //上一个接点
NextNode *DoubleNode //下一个接点
}
//双链表结构
type DoubleList struct {
lock *sync.RWMutex
Capacity uint //最大容量
Size uint //当前容量
Head *DoubleNode //头接点
Tail *DoubleNode //尾接点
}
//初始连接
func NewDoubleList(capability uint) *DoubleList {
list := new(DoubleList)
list.Capacity = capability
list.lock = new(sync.RWMutex)
list.Size = 0
list.Head = nil
list.Tail = nil
return list
}
//添加头部接点
func (list *DoubleList) AddHead(d interface{}) bool {
node := &DoubleNode{Data: d}
if list.Capacity == 0 {
return false
}
list.lock.Lock()
defer list.lock.Unlock()
//判断头部是否为nil
if list.Head == nil {
list.Head = node
list.Tail = node
} else {
//存在头部接点
list.Head.PreNode = node
node.NextNode = list.Head
list.Head = node
list.Head.PreNode = nil
}
list.Size++
if list.Size > list.Capacity {
//删除尾部一个元素
preNode := list.Tail.PreNode
list.Tail = preNode
list.Tail.NextNode = nil
list.Size--
}
return true
}
//添加尾部节点
func (list *DoubleList) AddTail(d interface{}) bool {
node := &DoubleNode{Data: d}
if list.Capacity == 0 {
return false
}
list.lock.Lock()
defer list.lock.Unlock()
//判断头部是否为nil
if list.Tail == nil {
list.Head = node
list.Tail = node
} else {
//存在头部接点
list.Tail.NextNode = node
node.PreNode = list.Tail
list.Tail = node
list.Tail.NextNode = nil
}
list.Size++
if list.Size > list.Capacity {
//删除头部一个元素
nextNode := list.Head.NextNode
list.Head = nextNode
list.Head.PreNode = nil
list.Size--
}
return true
}
//获取所有元素
func (list *DoubleList) RangeList() []interface{} {
if list.Size == 0 {
return nil
}
var data []interface{}
node := list.Head
for {
data = append(data, node.Data)
if node.NextNode == nil {
break
} else {
node = node.NextNode
}
}
return data
}
//获取所有元素
func (list *DoubleList) PrintDoubleList() {
fmt.Println("print double list")
values := list.RangeList()
for _, v := range values {
fmt.Println("node address:", &v, " value:", v)
}
}