/// <summary> /// 생성자 /// </summary> /// <param name="randomSeed">내부 난수 시드 값</param> /// <param name="comparer">요소 비교자</param> public SkipList(int randomSeed, IComparer <T> comparer) { _head = new SkipListNode <T>(1); _count++; _rnd = (randomSeed < 0) ? new Random() : new Random(randomSeed); _comparer = (comparer != null) ? comparer : Comparer <T> .Default; }
/// <summary> /// 지정된 값을 가진 요소를 생성해서 리스트에 추가한다. /// </summary> /// <param name="value"></param> public void Add(T value) { // 추가에 의해 변경되어야 할 기존 노드들을 구한다. var updates = BuildUpdateTable(value); var current = updates[0]; // 중복인지 검사해서 중복이면 추가 안함!!! if (current[0] != null && _comparer.Compare(current[0].Value, value) == 0) { return; } var newNode = new SkipListNode <T>(value, ChooseRandomHeight(_head.Height + 1)); _count++; // 새로운 노드의 Height가 헤드보다 크다면, 헤드 노드의 크기를 키우고, 그 곳을 새로운 노드를 가르키게 한다. if (newNode.Height > _head.Height) { _head.IncHeight(); _head[_head.Height - 1] = newNode; } // 새로운 노드의 자리를 정리한다. for (int i = 0; i < newNode.Height; i++) { if (i < updates.Count) { newNode[i] = updates[i][i]; updates[i][i] = newNode; } } }
/// <summary> /// 리스트의 모든 요소를 삭제한다. /// </summary> public void Clear() { _head = null; _head = new SkipListNode <T>(1); _count = 0; }