跳跃表的结构定义如下:

// 跳跃表节点结构体
type SkipListNode struct {
    val interface{}  // 保存的值
    score int   // 用于排序的分值
    level int  // 层高
    forwards []*SkipListNode  // 每层前进指针
}

// 跳跃表结构体
type SkipList struct {
    head *SkipListNode
    level int
    length int
}

实现操作如下:

  • 获取跳跃表长度
  • 获取跳跃表层数
  • 插入节点
  • 删除节点
  • 查找节点

代码如下:

package main

import (
    "math"
    "math/rand"
)

// 跳跃表的实现



// 跳跃表的最高层数
const MAX_LEVEL  = 16

// 跳跃表节点结构体
type SkipListNode struct {
    val interface{}  // 保存的值
    score int   // 用于排序的分值
    level int  // 层高
    forwards []*SkipListNode  // 每层前进指针
}

// 跳跃表结构体
type SkipList struct {
    head *SkipListNode
    level int
    length int
}

// 新建跳跃表节点
func NewSkipListNode(v interface{}, score, level int) *SkipListNode {
    return &SkipListNode{
        val:      v,
        score:    score,
        level:    level,
        forwards: nil,
    }
}

// 新建跳跃表对象
func NewSkipList() *SkipList {
    // 头结点方便操作
    head := NewSkipListNode(0, math.MaxInt32, MAX_LEVEL)
    return &SkipList{
        head:  head,
        level: 1,
        length:   0,
    }
}

// 获取跳跃表长度
func (this *SkipList)Length() int {
    return this.length
}

// 获取跳跃表层级
func (this *SkipList)Level() int {
    return this.level
}

// 插入节点到跳跃表中
func (this *SkipList) Insert(v interface{}, score int) int {
    if nil == v {
        return 1
    }

    // 查找插入位置
    cur := this.head

    // 记录每层的路径
    update := [MAX_LEVEL]*SkipListNode{}

    i := MAX_LEVEL - 1

    for ; i >= 0; i-- {
        for cur.forwards[i] != nil {
            if cur.forwards[i].val == v {
                return 2
            }
            if cur.forwards[i].score > score {
                update[i] = cur
                break
            }
            cur = cur.forwards[i]
        }
        if cur.forwards[i] == nil {
            update[i] = cur
        }
    }

    // 随机选取该节点层数
    level := 1
    for i := 1; i < MAX_LEVEL; i++ {
        if rand.Int31() % 7 == 1 {
            level++
        }
    }

    // 新建跳跃表节点
    newNode := NewSkipListNode(v, score, level)

    // 原有节点连接
    for i := 0; i <= level-1; i++ {
        next := update[i].forwards[i]
        update[i].forwards[i] = newNode
        newNode.forwards[i] = next
    }

    // 更新跳跃表层数
    if level > this.level {
        this.level = level
    }

    this.length++
    return 0

}

// 跳跃表的查找
func (this *SkipList) Find(v interface{}, score int) *SkipListNode  {
    if v == nil || this.length == 0 {
        return nil
    }
    // 查找的节点
    cur := this.head

    for i := this.level-1; i >=0; i-- {
        for cur.forwards[i] != nil {
            if cur.forwards[i].score == score && cur.forwards[i].val == v {
                return cur.forwards[i]
            }else if cur.forwards[i].score > score {
                break
            }
            cur = cur.forwards[i]
        }
    }
    return nil
}

// 删除节点
func (this *SkipList) Delete(v interface{}, score int) int {
    if v == nil {
        return 1
    }

    // 查找前驱节点
    cur := this.head

    // 记录前驱路径
    update := [MAX_LEVEL]*SkipListNode{}

    for i:= this.level - 1; i>=0; i-- {
        update[i] = this.head
        for cur.forwards[i] != nil {
            if cur.forwards[i].score == score && cur.forwards[i].val == v {
                update[i] = cur
                break
            }
            cur = cur.forwards[i]
        }
    }

    cur = update[0].forwards[0]

    for i:=cur.level-1; i>=0; i-- {
        if update[i] == this.head && cur.forwards[i] == nil {
            this.level = i
        }

        if update[i].forwards[i] == nil {
            update[i].forwards[i] = nil
        }else {
            update[i].forwards[i] = update[i].forwards[i].forwards[i]
        }
    }

    this.length--
    return 0
}

func main() {

}