Skip to content

Commit 1b5fe6e

Browse files
committed
Design Skiplist: AC
1 parent 0a86245 commit 1b5fe6e

File tree

2 files changed

+40
-25
lines changed

2 files changed

+40
-25
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
11
package leetcode.hard.page5;
22

3+
import org.junit.jupiter.api.Test;
4+
35
public class HardPage5 {
6+
@Test
7+
public void testSkipList() {
8+
Skiplist skiplist = new Skiplist();
9+
skiplist.add(1);
10+
skiplist.add(2);
11+
skiplist.add(3);
12+
}
413
}

LeetCodePrj/Java/leetcode/hard/page5/Skiplist.java

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,76 +18,82 @@ public Skiplist() {
1818
public boolean search(int target) {
1919
Node p = head;
2020
for (int i = levelCount - 1; i >= 0; --i) {
21-
while (Objects.nonNull(p.forwards[i]) && p.forwards[i].data < target) {
22-
p = p.forwards[i];
21+
while (Objects.nonNull(p.next[i]) && p.next[i].data < target) {
22+
p = p.next[i];
2323
}
2424
}
2525

26-
if (Objects.nonNull(p.forwards[0]) && p.forwards[0].data == target) {
26+
if (Objects.nonNull(p.next[0]) && p.next[0].data == target) {
2727
return true;
2828
} else {
2929
return false;
3030
}
3131
}
3232

3333
public void add(int num) {
34-
int level = Objects.isNull(head.forwards[0]) ? 1 : randomLevel();
34+
int level = Objects.isNull(head.next[0]) ? 1 : randomLevel();
3535

3636
if (level > levelCount) {
3737
level = ++levelCount;
3838
}
3939
Node newNode = new Node(level);
4040
newNode.data = num;
41-
Node p = head;
42-
43-
for (int i = levelCount - 1; i >= 0; --i) {
44-
while (Objects.nonNull(p.forwards[i]) && p.forwards[i].data < num) {
45-
p = p.forwards[i];
46-
}
41+
Node update[] = new Node[level];
42+
for (int i = 0; i < level; ++i) {
43+
update[i] = head;
44+
}
4745

48-
if (Objects.isNull(p.forwards[i])) {
49-
p.forwards[i] = newNode;
50-
} else {
51-
Node next = p.forwards[i];
52-
p.forwards[i] = newNode;
53-
newNode.forwards[i] = next;
46+
Node p = head;
47+
for (int i = level - 1; i >= 0; --i) {
48+
while (Objects.nonNull(p.next[i]) && p.next[i].data < num) {
49+
p = p.next[i];
5450
}
51+
update[i] = p;
5552
}
5653

54+
for (int i = 0; i < level; ++i) {
55+
newNode.next[i] = update[i].next[i];
56+
update[i].next[i] = newNode;
57+
}
5758
}
5859

5960
public boolean erase(int num) {
6061
Node[] update = new Node[levelCount];
6162
Node p = head;
6263
for (int i = levelCount - 1; i >= 0; --i) {
63-
while (Objects.nonNull(p.forwards[i]) && p.forwards[i].data < num) {
64-
p = p.forwards[i];
64+
while (Objects.nonNull(p.next[i]) && p.next[i].data < num) {
65+
p = p.next[i];
6566
}
6667
update[i] = p;
6768
}
6869

69-
if (Objects.nonNull(p.forwards[0]) && p.forwards[0].data == num) {
70+
if (Objects.nonNull(p.next[0]) && p.next[0].data == num) {
7071
for (int i = levelCount - 1; i >= 0; --i) {
71-
if (Objects.nonNull(update[i].forwards[i]) && update[i].forwards[i].data == num) {
72-
update[i].forwards[i] = update[i].forwards[i].forwards[i];
72+
if (Objects.nonNull(update[i].next[i]) && update[i].next[i].data == num) {
73+
update[i].next[i] = update[i].next[i].next[i];
7374
}
7475
}
76+
return true;
77+
} else {
78+
return false;
7579
}
76-
77-
return true;
7880
}
7981

82+
/**
83+
* Need to optimize
84+
* @return
85+
*/
8086
private int randomLevel() {
8187
return (int) Math.floor(r.nextInt(MAX_LEVEL)) + 1;
8288
}
8389

8490
class Node {
8591
private int data = -1;
8692

87-
private Node[] forwards;
93+
private Node[] next;
8894

8995
public Node(int level) {
90-
forwards = new Node[level];
96+
next = new Node[level];
9197
}
9298
}
9399
}

0 commit comments

Comments
 (0)