Skip to content

Commit 8da9f9e

Browse files
authored
Merge pull request #2336 from deanbear/main
手写跳表删除逻辑 bugfix
2 parents 2fefae7 + 05f556f commit 8da9f9e

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

docs/database/redis/redis-skiplist.md

+20-20
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ private int randomLevel() {
233233
/**
234234
* 默认情况下的高度为1,即只有自己一个节点
235235
*/
236-
private int leveCount = 1;
236+
private int levelCount = 1;
237237

238238
/**
239239
* 跳表最底层的节点,即头节点
@@ -271,9 +271,9 @@ public void add(int value) {
271271
maxOfMinArr[i].forwards[i] = newNode;
272272
}
273273

274-
//如果当前newNode高度大于跳表最高高度则更新leveCount
275-
if (leveCount < level) {
276-
leveCount = level;
274+
//如果当前newNode高度大于跳表最高高度则更新levelCount
275+
if (levelCount < level) {
276+
levelCount = level;
277277
}
278278

279279
}
@@ -299,7 +299,7 @@ public void add(int value) {
299299
public Node get(int value) {
300300
Node p = h;
301301
//找到小于value的最大值
302-
for (int i = leveCount - 1; i >= 0; i--) {
302+
for (int i = levelCount - 1; i >= 0; i--) {
303303
while (p.forwards[i] != null && p.forwards[i].data < value) {
304304
p = p.forwards[i];
305305
}
@@ -334,8 +334,8 @@ public Node get(int value) {
334334
public void delete(int value) {
335335
Node p = h;
336336
//找到各级节点小于value的最大值
337-
Node[] updateArr = new Node[leveCount];
338-
for (int i = leveCount - 1; i >= 0; i--) {
337+
Node[] updateArr = new Node[levelCount];
338+
for (int i = levelCount - 1; i >= 0; i--) {
339339
while (p.forwards[i] != null && p.forwards[i].data < value) {
340340
p = p.forwards[i];
341341
}
@@ -344,16 +344,16 @@ public void delete(int value) {
344344
//查看原始层节点前驱是否等于value,若等于则说明存在要删除的值
345345
if (p.forwards[0] != null && p.forwards[0].data == value) {
346346
//从最高级索引开始查看其前驱是否等于value,若等于则将当前节点指向value节点的后继节点
347-
for (int i = leveCount - 1; i >= 0; i--) {
347+
for (int i = levelCount - 1; i >= 0; i--) {
348348
if (updateArr[i].forwards[i] != null && updateArr[i].forwards[i].data == value) {
349349
updateArr[i].forwards[i] = updateArr[i].forwards[i].forwards[i];
350350
}
351351
}
352352
}
353353

354354
//从最高级开始查看是否有一级索引为空,若为空则层级减1
355-
while (leveCount > 1 && h.forwards[leveCount] == null) {
356-
leveCount--;
355+
while (levelCount > 1 && h.forwards[levelCount - 1] == null) {
356+
levelCount--;
357357
}
358358

359359
}
@@ -379,7 +379,7 @@ public class SkipList {
379379
/**
380380
* 默认情况下的高度为1,即只有自己一个节点
381381
*/
382-
private int leveCount = 1;
382+
private int levelCount = 1;
383383

384384
/**
385385
* 跳表最底层的节点,即头节点
@@ -436,9 +436,9 @@ public class SkipList {
436436
maxOfMinArr[i].forwards[i] = newNode;
437437
}
438438

439-
//如果当前newNode高度大于跳表最高高度则更新leveCount
440-
if (leveCount < level) {
441-
leveCount = level;
439+
//如果当前newNode高度大于跳表最高高度则更新levelCount
440+
if (levelCount < level) {
441+
levelCount = level;
442442
}
443443

444444
}
@@ -463,7 +463,7 @@ public class SkipList {
463463
public Node get(int value) {
464464
Node p = h;
465465
//找到小于value的最大值
466-
for (int i = leveCount - 1; i >= 0; i--) {
466+
for (int i = levelCount - 1; i >= 0; i--) {
467467
while (p.forwards[i] != null && p.forwards[i].data < value) {
468468
p = p.forwards[i];
469469
}
@@ -484,8 +484,8 @@ public class SkipList {
484484
public void delete(int value) {
485485
Node p = h;
486486
//找到各级节点小于value的最大值
487-
Node[] updateArr = new Node[leveCount];
488-
for (int i = leveCount - 1; i >= 0; i--) {
487+
Node[] updateArr = new Node[levelCount];
488+
for (int i = levelCount - 1; i >= 0; i--) {
489489
while (p.forwards[i] != null && p.forwards[i].data < value) {
490490
p = p.forwards[i];
491491
}
@@ -494,16 +494,16 @@ public class SkipList {
494494
//查看原始层节点前驱是否等于value,若等于则说明存在要删除的值
495495
if (p.forwards[0] != null && p.forwards[0].data == value) {
496496
//从最高级索引开始查看其前驱是否等于value,若等于则将当前节点指向value节点的后继节点
497-
for (int i = leveCount - 1; i >= 0; i--) {
497+
for (int i = levelCount - 1; i >= 0; i--) {
498498
if (updateArr[i].forwards[i] != null && updateArr[i].forwards[i].data == value) {
499499
updateArr[i].forwards[i] = updateArr[i].forwards[i].forwards[i];
500500
}
501501
}
502502
}
503503

504504
//从最高级开始查看是否有一级索引为空,若为空则层级减1
505-
while (leveCount > 1 && h.forwards[leveCount] == null) {
506-
leveCount--;
505+
while (levelCount > 1 && h.forwards[levelCount - 1] == null) {
506+
levelCount--;
507507
}
508508

509509
}

0 commit comments

Comments
 (0)