template<typenameT>// assert: 0 <= r < sizeTList<T>::operator[](Rankr)const{// O(r),效率低下,可偶尔为之,却不宜常用Posi(T)p=first();// 从首节点出发while(0<r--)p=p->succ;// 顺数第 r 个节点returnp->data;// 目标节点}// 任一节点的秩,亦即其前驱的总数
查找
在节点 p (可能是 trailer) 的 n 个 (真) 前驱中,找到等于 e 的最后者
1
2
3
4
5
6
template<typenameT>// 从外部调用时,0 <= n <= rank(p) < _sizePosi(T)List<T>::find(Tconst&e,intn,Posi(T)p)const{// 顺序查找,O(n)while(0<n--)// 从右向左,逐个将 p 的前驱与 e 比对if(e==(p=p->pred)->data)returnp;// 直至命中或范围越界returnNULL;// 若越出左边界,意味着查找失败}// header 的存在使得处理更为简洁
插入
1
2
3
4
5
6
7
8
9
10
11
template<typenameT>Posi(T)List<T>::insertBefore(Posi(T)p,Tconst&e){_size++;returnp->insertAsPred(e);// e 当作 p 的前驱插入}template<typenameT>// 前插入算法 (后插入算法完全对称)Posi(T)ListNode<T>::insertAsPred(Tconst&e){// O(10Posi(T)x=newListNode(e,pred,this);// 创建 (耗时 100 倍)pred->succ=x;pred=x;returnx;// 建立链接,返回新节点的位置}
复制
1
2
3
4
5
6
7
template<typenameT>// 基本接口voidList<T>::copyNodes(Posi(T)p,intn){// O(n)init();// 创建头、尾哨兵节点并做初始化while(n--){// 将起自 p 的 n 项依次作为末节点插入insertAsLast(p->data);p=p->succ;}}
删除
1
2
3
4
5
6
7
template<typenameT>TList<T>::remove(Posi(T)p){// O(1)Te=p->data;// 备份待删除节点数值 (设类型 T 可直接赋值)p->pred->succ=p->succ;p->succ->pred=p->pred;deletep;_size--;returne;// 返回备份数值}