// Search for element in skip list private Tuple <SkipNode <T>, SkipNode <T>[]> SearchNode(T data) { var current = head; // create update array and initialize it var update = new SkipNode <T> [Size + 1]; // start from highest level of skip list for (int i = level; i >= 0; i--) { // Move the current pointer forward while key is greater than key of node next to current while (current.Forward[i] != null && current.Forward[i].Data.CompareTo(data) < 0) { current = current.Forward[i]; } // Insert current in update and move one level down and continue search update[i] = current; } // reached level 0 and forward pointer to right, // which is desired position to insert key. current = current.Forward[0]; return(new Tuple <SkipNode <T>, SkipNode <T>[]>(current, update)); }
public SkipList(int size, double fraction = 0.5) { Size = size; Fraction = fraction; level = 0; head = new SkipNode <T>(default(T), Size); }
public void Insert(T data) { var searchResult = SearchNode(data); var current = searchResult.Item1; var update = searchResult.Item2; // if current is NULL that means we have reached to end of the level // or current's key is not equal to key to insert // that means we have to insert node between update[0] and current node if (current == null || !current.Data.Equals(data)) { // Generate a random level for node int rlevel = RandomLevel(); // If random level is greater than list's current // level (node with highest level inserted in // list so far), initialize update value with pointer // to header for further use if (rlevel > level) { for (int i = level + 1; i < rlevel + 1; i++) { update[i] = head; } // Update the list current level level = rlevel; } // create new node with random level generated var n = new SkipNode <T>(data, rlevel); // insert node by rearranging pointers for (int i = 0; i <= rlevel; i++) { n.Forward[i] = update[i].Forward[i]; update[i].Forward[i] = n; } } }