单链表介绍
上个章节我们实现了并发不安全的链表, 并发不安全单链表
这次我们实现并发安全的链表,以及增加了,首尾节点
,更加方便的插入和查询。
想必大家现在已经有了大概的思路了,下面的代码实现和上一章节差不多,但是更加巧妙的运用了head,tail指针,具体的思想可以把代码debug下了解他的思路
使用哨兵实现单链表,可以用更少的代码实现,我就写了一个前插和后插,其他的可以自己研究下
单链表的结构
// SingleNode 并发安全单链表
type SingleNode struct {
Data any
Next *SingleNode
}
type SingleList struct {
mutex *sync.RWMutex
Head *SingleNode
Tail *SingleNode
Size uint
}
func NewList() *SingleList {
return &SingleList{
Size: 0,
Head: nil,
Tail: nil,
mutex: new(sync.RWMutex),
}
}
后插元素
// Append 后插元素
func (List *SingleList) Append(node *SingleNode) bool {
if node == nil {
return false
}
List.mutex.Lock()
defer List.mutex.Unlock()
if List.Size == 0 {
List.Head = node
List.Tail = node
List.Size = 1
return true
}
tail := List.Tail
tail.Next = node
List.Tail = node
List.Size += 1
return true
}
前插元素
// AddElem 前插元素
func (List *SingleList) AddElem(node *SingleNode) bool {
if node == nil {
return false
}
if List.Size == 0 {
List.Head = node
List.Tail = node
List.Size = 1
return true
}
node.Next = List.Head
List.Head = node
List.Size++
return true
}
指定位置插入
// Insert 指定位置插入