@@ -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