File tree Expand file tree Collapse file tree
java-base-demo/src/main/java/com/jay/skiplist Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments