go双向循环链表

 直接上代码,里面主要是使用了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)
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偶是江湖中人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值