public void Add(TKey key, TValue value) { int pos = GetPosition(key, items.Length); if (items[pos] == null) { items[pos] = new ZLinkedList <Tuple <TKey, TValue> >(); } ZLinkedListNode <Tuple <TKey, TValue> > current = items[pos].Head; while (current != null) { if (current.Value.Item1.Equals(key)) { throw new Exception("Duplicate key, cannot insert."); } current = current.NextNode; } size++; if (NeedToGrow()) { GrowAndRehash(); } pos = GetPosition(key, items.Length); if (items[pos] == null) { items[pos] = new ZLinkedList <Tuple <TKey, TValue> >(); } items[pos].Add(new Tuple <TKey, TValue>(key, value)); }
public ZLinkedList <T> MergeSortedLinkedList(ZLinkedList <T> linkedList) { ZLinkedList <T> newList = new ZLinkedList <T>(); ZLinkedListNode <T> node1 = this.Head; ZLinkedListNode <T> node2 = linkedList.Head; while (node1 != null || node2 != null) { if ((node1 != null && node1.Value.CompareTo(node2.Value) >= 1) || node2 == null) { newList.Add(node1.Value); if (node1 != null && node1.NextNode != null) { node1 = node1.NextNode; } } else { newList.Add(node2.Value); if (node2 != null && node2.NextNode != null) { node2 = node2.NextNode; } } } return(newList); }
private void GrowAndRehash() { fillFactor *= 2; ZLinkedList <Tuple <TKey, TValue> >[] newItems = new ZLinkedList <Tuple <TKey, TValue> > [items.Length * 2]; foreach (var item in items.Where(x => x != null)) { ZLinkedListNode <Tuple <TKey, TValue> > current = item.Head; while (current != null) { var pos = GetPosition(current.Value.Item1, newItems.Length); if (newItems[pos] == null) { newItems[pos] = new ZLinkedList <Tuple <TKey, TValue> >(); } newItems[pos].Add(new Tuple <TKey, TValue>(current.Value.Item1, current.Value.Item2)); current = current.NextNode; } } items = newItems; }