package com.thread.utils.collections;
public class SimpleSkipList {
private final static byte HEAD_NODE = (byte) -1;
private final static byte DATA_NODE = (byte) 0;
private final static byte TAIL_NODE = (byte) -1;
private Node head;
private Node tail;
private int size;
private int height;
private Random random;
public SimpleSkipList() {
this.head = new Node(null, HEAD_NODE);
this.tail = new Node(null, TAIL_NODE);
head.right = tail;
tail.left = head;
this.random = new Random(System.currentTimeMillis());
}
public int size() {
return size;
}
public boolean isEmpty() {
return size() == 0;
}
public Node find(Integer element) {
Node current = head;
for (; ; ) {
while (current.right.type != TAIL_NODE && current.right.value <= element) {
current = current.right;
}
if (current.down != null) {
current = current.down;
} else {
break;
}
}
return current;
}
public boolean contains(Integer element) {
Node node = this.find(element);
return (node.value == element);
}
public Integer get(Integer element) {
Node node = this.find(element);
return node.value == element ? node.value : null;
}
public void add(Integer element) {
Node node = this.find(element);
Node newNode = new Node(element);
newNode.left = node;
newNode.right = node.right;
node.right.left = newNode;
node.right = newNode;
int currentLeve = 0;
while (random.nextDouble() < 0.5d) {
if (currentLeve >= height) {
height++;
Node headNew = new Node(null, HEAD_NODE);
Node tailNew = new Node(null, TAIL_NODE);
headNew.right = tailNew;
headNew.down = head;
head.up = headNew;
tailNew.left = headNew;
tailNew.down = tail;
tail.up = headNew;
head = headNew;
tail = tailNew;
}
while ((node != null) && (node.up == null)) {
node = node.left;
}
node = node.up;
Node upNode = new Node(element);
upNode.left = node;
upNode.right = node.right;
upNode.down = newNode;
node.right.left = upNode;
node.right = upNode;
newNode.up = upNode;
newNode = upNode;
currentLeve++;
}
size++;
}
public void dumpSkipList() {
Node temp = head;
for (int i = height + 1; i > 0; i--) {
System.out.printf("Total [%d] height [%d]", height + 1, i);
Node node = temp.right;
while (node.type == DATA_NODE) {
System.out.printf("-> %d", node.value);
node = node.right;
}
System.out.print("\n");
temp = temp.down;
}
System.out.println("==========================================");
}
static class Node {
private Integer value;
private Node up, down, left, right;
private byte type;
public Node(Integer value, byte type) {
this.value = value;
this.type = type;
}
public Node(Integer value) {
this(value, DATA_NODE);
}
@Override
public String toString() {
return value + "type" + type;
}
}
public static void main(String[] args) {
SimpleSkipList simpleSkipList = new SimpleSkipList();
simpleSkipList.add(10);
simpleSkipList.dumpSkipList();
simpleSkipList.add(1);
simpleSkipList.dumpSkipList();
Random random = new Random();
for (int i = 0; i < 100; i++) {
simpleSkipList.add(random.nextInt(1000));
}
simpleSkipList.dumpSkipList();
}
}