0001 template <typename T> TowerPosi<T> Skiplist<T>::insert(const T& e) { 0002 search(e); if ((_x != head) && (e == key(_x))) return _x; //禁止重复 0003 TowerPosi<T> pred = _x, succ = _x->succ; //同层的前驱(或为head)、后继(或为tail) 0004 _x = List::insert(_x, Tower<T>(e)); //紧邻于_x之右侧,创建一座空塔 0005 for (Rank h = 0; !h || (rand()&1); h++) { //积砖成塔(至少一层) 0006 if (height(head) < h+1) { //若总高度不足h 0007 tower(head).insert(Brick<T>(nullptr, tail)); //则需创建 0008 tower(tail).insert(Brick<T>(head, nullptr)); //一层空表 0009 } //if 0010 while (height(pred) == h) //踏过若干塔顶,找到前驱 0011 pred = tower(pred)[h-1].pred; 0012 while (height(succ) == h) //踏过若干塔顶,找到后继 0013 succ = tower(succ)[h-1].succ; 0014 tower(_x).insert(Brick<T>(pred, succ)); //新塔长高一层,并 0015 tower(pred)[h].succ = tower(succ)[h].pred = _x; //与前驱、后继连接 0016 } //for 0017 return _x; //返回新塔 0018 } //insert