Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private class SkipList<T> : IEnumerable<T>
- {
- private Node<T> head;
- private Node<T> bottomHead;
- public int Count { get { return count; } }
- private int count;
- private Random r;
- Comparer<T> comparer;
- public T Min { get { return bottomHead.Next.Val; } }
- public SkipList()
- {
- comparer = Comparer<T>.Default;
- r = new Random();
- count = 0;
- head = new Node<T>();
- bottomHead = head;
- }
- public void Add(T val)
- {
- Node<Node<T>> savedHead = null;
- // Find insert location
- var node = head;
- while (true)
- {
- if (node.Next != null && comparer.Compare(node.Next.Val, val) != 1)
- node = node.Next;
- else if (node.Down != null)
- {
- savedHead = new Node<Node<T>>(node, savedHead, null);
- node = node.Down;
- }
- else
- break;
- }
- // Add node
- var newNode = new Node<T>(val, node.Next, null);
- node.Next = newNode;
- // Add layers until coinflip is lost
- while (r.Next(0, 2) == 1)
- {
- var newerNode = new Node<T>(val, null, newNode);
- if (savedHead != null)
- {
- newerNode.Next = savedHead.Val.Next;
- savedHead.Val.Next = newerNode;
- savedHead = savedHead.Next;
- }
- else
- {
- var newHead = new Node<T>(default(T), newerNode, head);
- head = newHead;
- }
- newNode = newerNode;
- }
- ++count;
- }
- public bool Remove(T val)
- {
- Node<Node<T>> savedHead = null;
- bool deletedOne = false;
- // Find node that points to the ndoe we want to delete
- var node = head;
- while (node != null)
- {
- while (true)
- {
- if (node.Next != null && comparer.Compare(node.Next.Val, val) == -1)
- node = node.Next;
- else if (node.Next != null && comparer.Compare(node.Next.Val, val) == 0)
- break;
- else if (node.Down != null)
- {
- savedHead = new Node<Node<T>>(node, savedHead, null);
- node = node.Down;
- }
- else
- break;
- }
- if (node.Next == null || comparer.Compare(node.Next.Val, val) != 0) break;
- deletedOne = true;
- node.Next = node.Next.Next;
- node = node.Down;
- }
- --count;
- return deletedOne;
- }
- public bool Contains(T val)
- {
- throw new NotImplementedException();
- }
- public override string ToString()
- {
- var sb = new StringBuilder();
- var levelNode = head;
- while (levelNode != null)
- {
- var node = levelNode.Next;
- while (node != null)
- {
- sb.Append(node.Val + "->");
- node = node.Next;
- }
- levelNode = levelNode.Down;
- sb.Append('\n');
- }
- return sb.ToString();
- }
- public IEnumerator<T> GetEnumerator()
- {
- var node = bottomHead;
- while (node.Next != null)
- {
- node = node.Next;
- yield return node.Val;
- }
- }
- IEnumerator IEnumerable.GetEnumerator()
- {
- return this.GetEnumerator();
- }
- private class Node<T>
- {
- public T Val;
- public Node<T> Next;
- public Node<T> Down;
- public Node() { }
- public Node(T val, Node<T> next, Node<T> down)
- {
- Val = val; Next = next; Down = down;
- }
- }
- }
Add Comment
Please, Sign In to add comment