571
社区成员
发帖
与我相关
我的任务
分享type Node struct {
prev, next *Node
linkTable *LinkTable
Val any
}
prev,next:用于实现双向链表linkTable:标识结点所属链表Val:结点存储的值type LinkTable struct {
head, tail *Node
len int
valType any
}
head,tail:标识链表的头尾节点len:当前链表的长度valType:为链表提供泛型支持(go 1.18尚未支持泛型方法)Create方法返回一个初始化完的LinkTable
func Create() *LinkTable {
linkTable := &LinkTable{
head: nil,
tail: nil,
len: 0,
valType: nil,
}
return linkTable
}
Clear方法清空LinkTable
func (l *LinkTable) Clear() {
l.head = nil
l.tail = nil
l.len = 0
l.valType = nil
}
GetType:获取链表存储的元素类型Front:获取表头结点Back:获取表尾结点Len:获取链表长度func (l *LinkTable) GetType() reflect.Type {
return reflect.TypeOf(l.valType)
}
func (l *LinkTable) Front() *Node {
return l.head
}
func (l *LinkTable) Back() *Node {
return l.tail
}
func (l *LinkTable) Len() int {
return l.len
}
PushFront:将元素添加至表头PushBack:将元素添加至表头Remove:删除指定结点func (l *LinkTable) PushFront(v any) *Node {
n := &Node{
prev: nil,
next: nil,
linkTable: l,
Val: v,
}
if l.head == nil && l.tail == nil {
l.head = n
l.tail = n
l.valType = v
} else {
// support generic
if reflect.TypeOf(v) != reflect.TypeOf(l.valType) {
return nil
}
n.next = l.head
l.head.prev = n
l.head = n
}
l.len++
return n
}
func (l *LinkTable) PushBack(v any) *Node {
n := &Node{
prev: nil,
next: nil,
linkTable: l,
Val: v,
}
if l.head == nil && l.tail == nil {
l.head = n
l.tail = n
l.valType = v
} else {
// support generic
if reflect.TypeOf(v) != reflect.TypeOf(l.valType) {
return nil
}
n.prev = l.tail
l.tail.next = n
l.tail = n
}
l.len++
return n
}
func (l *LinkTable) Remove(n *Node) any {
if n == nil {
return nil
}
if n.linkTable == l {
switch {
case l.head == n && l.tail == n:
l.head = nil
l.tail = nil
case l.head == n:
l.head = l.head.next
n.next.prev = nil
case l.tail == n:
l.tail = l.tail.prev
n.prev.next = nil
default:
n.prev.next = n.next
n.next.prev = n.prev
}
n.prev = nil
n.next = nil
n.linkTable = nil
l.len--
}
return n.Val
}
Val字段存储值linkTable字段存储结点所属的链表,用于判断操作的结点是否属于当前链表valType字段用来实现简易泛型,在首次向链表插入结点时确定泛型类型linktable/linktable_test.go