publicclassSkipList { privatestatic final int MAX_LEVEL = 16; privateint levelCount = 1; private Node head = new Node(); private Random random = new Random();
public Node find(intvalue){ Node p = head; for(int i = levelCount - 1; i >= 0; i--){ while(p.forwards[i] != null && p.forwards[i].data < value){ p = p.forwards[i]; } } if(p.forwards[0] != null && p.forwards[0].data == value) return p.forwards[0]; returnnull; }
publicvoidinsert(intvalue){ Node p = head; int level = randomLevel(); Node node = new Node(); node.data = value; node.maxLevel = level; Node update[] = new Node[level]; for(int i = level; i >= 0; i--){ while(p.forwards[i] != null && p.forwards[i].data < value){ p = p.forwards[i]; } update[i] = p; } for(int i = 0; i < level; i++){ node.forwards[i] = update[i].forwards[i]; update[i].forwards[i] = node; } if(levelCount < level) levelCount = level; }
publicvoiddelete(intvalue){ Node[] deleteNode = new Node[MAX_LEVEL]; Node p = head; for(int i = levelCount - 1; i >=0; i--){ while(p.forwards[i] != null && p.forwards[i].data < value){ p = p.forwards[i]; } deleteNode[i] = p; } if(p.forwards[0] != null && p.forwards[0].data == value){ for(int i = levelCount - 1; i >= 0; i--){ if(deleteNode[i] != null && deleteNode[i].forwards[i].data == value){ deleteNode[i].forwards[i] = deleteNode[i].forwards[i].forwards[i]; } } } }
publicvoidprintAll(){ Node p = head; while(p.forwards[0] != null){ System.out.print(p.forwards[0] + " "); p = p.forwards[0]; } System.out.println(); } privateintrandomLevel() { int level = 0; for(int i = 0; i < MAX_LEVEL; i++){ if(random.nextInt()%2 == 1){ level++; } } return level; }