@@ -50,7 +50,15 @@ func main() {
50
50
fmt .Println ("skip list" , data )
51
51
52
52
sl := createSkipList ()
53
- fmt .Println (sl .hnode .forward )
53
+
54
+ fmt .Println (sl , sl .hnode .forward )
55
+ for i := 0 ; i < 10 ; i ++ {
56
+ insert (sl , i )
57
+ }
58
+
59
+ fmt .Println (search (sl , 11 ))
60
+ fmt .Println (search (sl , 1 ))
61
+
54
62
}
55
63
56
64
func insert (sl * SkipList , kv int ) bool {
@@ -60,20 +68,20 @@ func insert(sl *SkipList, kv int) bool {
60
68
p = sl .hnode
61
69
k := sl .lv
62
70
63
- for i := k - 1 ; i >= 0 ; i -- {
64
- q = p .forward [i ]
65
- for q .key < kv {
66
- p = q
71
+ for i := k - 1 ; i >= 0 ; i -- { //loop level
72
+ for p != nil && p .forward [i ] != nil && p .forward [i ].key < kv {
73
+ p = p .forward [i ]
67
74
}
68
75
update [i ] = p
69
76
}
70
77
71
- //插入数据相同 直接返回false
72
- if q != nil && q .key == kv {
78
+ if p != nil && p .key == kv {
73
79
return false
74
80
}
75
81
76
82
k = randomLevel ()
83
+
84
+ //update hnode forword pointer
77
85
if k > sl .lv {
78
86
for i := sl .lv ; i < k ; i ++ {
79
87
update [i ] = sl .hnode
@@ -82,9 +90,14 @@ func insert(sl *SkipList, kv int) bool {
82
90
}
83
91
84
92
q = createNode (k , kv )
93
+
85
94
for i := 0 ; i < k ; i ++ {
86
- q .forward [i ] = update [i ].forward [i ]
87
- update [i ].forward [i ] = q
95
+ if update [i ] != nil {
96
+ q .forward [i ] = update [i ].forward [i ]
97
+ update [i ].forward [i ] = q
98
+ } else {
99
+
100
+ }
88
101
}
89
102
90
103
return true
@@ -95,16 +108,14 @@ func delete() {
95
108
}
96
109
97
110
func search (sl * SkipList , kv int ) int {
98
- var p , q * node
99
- p = sl .hnode
100
- k := sl .lv
101
- for i := k - 1 ; i >= 0 ; i -- {
102
- q = p .forward [i ]
103
- for q .key <= kv {
104
- if q .key == kv {
105
- return q .key
111
+ var q * node
112
+ q = sl .hnode
113
+ for i := sl .lv - 1 ; i >= 0 ; i -- {
114
+ for q != nil && q .forward [i ] != nil && q .forward [i ].key <= kv {
115
+ if q .forward [i ].key == kv {
116
+ return q .forward [i ].key
106
117
}
107
- p = q
118
+ q = q . forward [ i ]
108
119
}
109
120
}
110
121
return - 1
0 commit comments