Skip to content

Commit a7e7cd7

Browse files
committed
跳跃表代码提交
1 parent 42d8d47 commit a7e7cd7

3 files changed

Lines changed: 171 additions & 0 deletions

File tree

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package com.jay.skiplist;
2+
3+
import java.util.Random;
4+
5+
/**
6+
* @author xiang.wei
7+
* @date 2020/8/2 3:51 PM
8+
*/
9+
public class SkipList<T> {
10+
private SkipListNode<T> head, tail;
11+
/**
12+
* 节点总数
13+
*/
14+
private int nodes;
15+
/**
16+
* 层高
17+
*/
18+
private int listLevel;
19+
/**
20+
* 随机函数
21+
*/
22+
private Random random;
23+
/**
24+
* 向上提升一个的概率
25+
*/
26+
private static final double PROBABILITY = 0.5;
27+
28+
public SkipList() {
29+
random = new Random();
30+
clear();
31+
}
32+
33+
public void clear() {
34+
head = new SkipListNode<T>(SkipListNode.HEAD_KEY, null);
35+
tail = new SkipListNode<T>(SkipListNode.TAIL_KEY, null);
36+
// TODO: 2020/8/2
37+
38+
listLevel = 0;
39+
nodes = 0;
40+
}
41+
42+
public boolean isEmpty() {
43+
return nodes == 0;
44+
}
45+
46+
public int size() {
47+
return nodes;
48+
}
49+
50+
/**
51+
* 在最下面一层,找到要插入的位置前面的那个key
52+
* @param key
53+
* @return
54+
*/
55+
private SkipListNode<T> findNode(int key) {
56+
SkipListNode<T> p = head;
57+
while (true) {
58+
while (p.right.getKey() != SkipListNode.TAIL_KEY
59+
&& p.right.getKey() <= key) {
60+
p = p.right;
61+
}
62+
if (p.down != null) {
63+
p = p.down;
64+
} else {
65+
break;
66+
}
67+
}
68+
return p;
69+
}
70+
71+
/**
72+
* 查询是否存储key,存在则返回该节点,否则返回null
73+
* @param key
74+
* @return
75+
*/
76+
public SkipListNode<T> search(int key) {
77+
SkipListNode<T> p = findNode(key);
78+
if (key == p.getKey()) {
79+
return p;
80+
} else {
81+
return null;
82+
}
83+
}
84+
85+
public void put(int k, T v) {
86+
SkipListNode<T> p = findNode(k);
87+
//如果key值相同,替换原来的value即可结束
88+
if (k == p.getKey()) {
89+
p.setValue(v);
90+
return;
91+
}
92+
}
93+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.jay.skiplist;
2+
3+
/**
4+
* 跳跃表的节点,包括key-value和上下左右4个指针
5+
* @author xiang.wei
6+
* @date 2020/8/2 3:34 PM
7+
*/
8+
public class SkipListNode<T> {
9+
private int key;
10+
private T value;
11+
/**
12+
* 上下左右 四个指针
13+
*/
14+
public SkipListNode<T> up,down,left, right;
15+
16+
/**
17+
* 负无穷
18+
*/
19+
public static final int HEAD_KEY = Integer.MIN_VALUE;
20+
/**
21+
* 正无穷
22+
*/
23+
public static final int TAIL_KEY = Integer.MAX_VALUE;
24+
25+
public SkipListNode(int key, T value) {
26+
this.key = key;
27+
this.value = value;
28+
}
29+
30+
public int getKey() {
31+
return key;
32+
}
33+
34+
public void setKey(int key) {
35+
this.key = key;
36+
}
37+
38+
public T getValue() {
39+
return value;
40+
}
41+
42+
public void setValue(T value) {
43+
this.value = value;
44+
}
45+
46+
@Override
47+
public boolean equals(Object obj) {
48+
if (this == obj) {
49+
return true;
50+
}
51+
if (obj == null) {
52+
return false;
53+
}
54+
if (!(obj instanceof SkipListNode<?>)) {
55+
return false;
56+
}
57+
SkipListNode<T> ent;
58+
try {
59+
ent = (SkipListNode<T>) obj;
60+
} catch (Exception e) {
61+
return false;
62+
}
63+
return (ent.getKey() == key) && (ent.getValue() == value);
64+
}
65+
66+
@Override
67+
public String toString() {
68+
return super.toString();
69+
}
70+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.jay.skiplist;
2+
3+
/**
4+
* @author xiang.wei
5+
* @date 2020/8/2 3:22 PM
6+
*/
7+
public class SkipListTest {
8+
}

0 commit comments

Comments
 (0)