package Order300;
import java.util.ArrayList; import java.util.Random;
public class T1206_design_skiplist {
public static void main(String[] args) {}
public static class Skiplist {
private static class Node {
int level; int val; Node w, a, s, d;
static Node from(int val, int level) { Node out = new Node(); out.val = val; out.level = level; return out; }
Node setS(Node who) { this.s = who; return this; }
}
private static final int MAX_LAVAL = 64;
ArrayList<Node> dummys = new ArrayList<>();
private boolean coinFlip() { return (System.nanoTime() & 3) == 0; }
private Node findValAtLevel(Node begin, int num, int tarLevel) { if (tarLevel < 1) return null; Node cur = begin; while (true) { if (cur.d != null) { if (cur.val < num && num <= cur.d.val) { if (cur.level > tarLevel && cur.s != null) { cur = cur.s; } else { cur = cur.d; break; } } else { cur = cur.d; } } else { if (cur.level > tarLevel && cur.s != null) { cur = cur.s; } else { break; } } } return (cur.val == num && cur.level == tarLevel) ? cur : null; }
private void addAtLevel(int num, int tarLevel) { Node cur; if (tarLevel > this.dummys.size()) for ( int i = this.dummys.size() + 1; i <= tarLevel; i++ ) { this.dummys.add( Node .from(Integer.MIN_VALUE, i) .setS(this.dummys.get(this.dummys.size() - 1)) ); } cur = this.dummys.get(this.dummys.size() - 1); while (true) { if (cur.d != null) { if (cur.val <= num && num <= cur.d.val) { if (cur.level > tarLevel && cur.s != null) { cur = cur.s; } else { break; } } else { cur = cur.d; } } else { if (cur.level > tarLevel && cur.s != null) { cur = cur.s; } else { break; } } }
Node who = Node.from(num, tarLevel); Node tail = cur.d; Node below = findValAtLevel(cur, num, tarLevel - 1); cur.d = who; who.a = cur; who.d = tail; if (tail != null) tail.a = who; who.s = below; if (below != null) below.w = who; if (tarLevel < MAX_LAVAL && coinFlip()) addAtLevel(num, tarLevel + 1); }
public Skiplist() { this.dummys.add(Node.from(Integer.MIN_VALUE, 1)); }
public void add(int num) { addAtLevel(num, 1); }
public boolean search(int target) { return (findValAtLevel(dummys.get(dummys.size() - 1), target, 1) == null) ? false : true; }
public boolean erase(int num) { Node cur = findValAtLevel(dummys.get(dummys.size() - 1), num, 1); if (cur == null) return false; Node[] lefts = new Node[MAX_LAVAL]; Node[] rights = new Node[MAX_LAVAL]; int nodeCnt = 0; while (cur != null) { if (cur.val != num) throw new RuntimeException( "找错了要删除的中心节点" ); lefts[nodeCnt] = cur.a; rights[nodeCnt] = cur.d; cur = cur.w; nodeCnt++; } for (int i = 0; i < nodeCnt; i++) { if (lefts[i] != null) lefts[i].d = rights[i]; if (rights[i] != null) rights[i].a = lefts[i]; } return true; } }
static class Skiplist_终极 {
private static final int MAX_LAVAL = 64;
Node head;
public Skiplist_终极() { head = new Node(null, null, Integer.MIN_VALUE); }
public boolean search(int target) { Node p; for (p = head; p != null; p = p.down) { while (p.right != null && target > p.right.val) { p = p.right; } if (p.right != null && p.right.val == target) { return true; } } return false; }
Node[] stack = new Node[MAX_LAVAL]; Random random = new Random();
public void add(int num) { int size = 0; for (Node p = head; p != null; p = p.down) { while (p.right != null && num > p.right.val) { p = p.right; } stack[size++] = p; } Node down = null; Node node; boolean up = true; while (up && size > 0) { node = stack[--size]; node.right = new Node(node.right, down, num); down = node.right; up = (random.nextInt() & 3) == 0; } if (up) { head = new Node(new Node(null, down, num), head, Integer.MIN_VALUE); } }
public boolean erase(int num) { boolean flag = false; for (Node p = head; p != null; p = p.down) { while (p.right != null && num > p.right.val) { p = p.right; } if (p.right != null && p.right.val == num) { p.right = p.right.right; flag = true; } } return flag; }
static class Node {
Node right, down; int val;
public Node(Node right, Node down, int val) { this.right = right; this.down = down; this.val = val; } } } }
|