Skip to content

Commit 0df784a

Browse files
committed
update
1 parent c308f08 commit 0df784a

1 file changed

Lines changed: 10 additions & 0 deletions

File tree

collection/skiplist/skiplist.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ func (s *SkipList[T]) traverse(val T, level int) (*node[T], []*node[T]) {
9090
// find 查找跳表中,是否存在值为val的索引项(节点),并返回该索引
9191
func (s *SkipList[T]) find(val T) *node[T] {
9292
p, _ := s.traverse(val, s.levels)
93+
// 防御性编程:如果 SkipList 未正确初始化(header 为 nil),traverse 返回 nil
94+
if p == nil {
95+
return nil
96+
}
9397
// 由于上层的数据,下层一定有,故不管当前在第几层,直接在第0层确认到底有没有该数据即可
9498
if p.forward[0] != nil && s.compare(p.forward[0].val, val) == 0 {
9599
return p.forward[0]
@@ -103,6 +107,9 @@ func (s *SkipList[T]) Insert(val T) error {
103107
level := randomLevel()
104108
n := newNode(level, withVal[T](val))
105109
p, update := s.traverse(val, level)
110+
if p == nil {
111+
return errors.New("algokit: skiplist not initialized")
112+
}
106113
if p.forward[0] != nil && s.compare(p.forward[0].val, val) == 0 {
107114
return ErrSameNode
108115
}
@@ -119,6 +126,9 @@ func (s *SkipList[T]) Insert(val T) error {
119126

120127
func (s *SkipList[T]) Delete(val T) {
121128
p, update := s.traverse(val, s.levels)
129+
if p == nil {
130+
return
131+
}
122132
if p.forward[0] == nil || s.compare(p.forward[0].val, val) != 0 {
123133
return
124134
}

0 commit comments

Comments
 (0)