有序列表
唯一化处理
与有序向量同理,有序列表中重复的元素一定(在逻辑上)紧邻。设置位置指针p和q分别指向相邻的节点,若二者雷同则删除q,否则转向下一对相邻节点如此反复迭代,直至检查所有节点:
template <typename T> int List<T>::uniquify()
{
if(_size < 2) return 0;
int oldSize = _size;
Posi(T) p = first(); Posi(T) q;
while(trailer != (q = p -> succ))
if(p -> data != q -> data)
p = q;
else
remove(q);
return oldSize - _size;
}
复杂度: O(n)
查找
template <typename T> Posi(T) List<T>::search(T const& e, int n, Posi(T) p)
{
while(0 < n--)
if(((p = p -> pred) -> data) <= e)
break;
return p;
}
有序列表的查找算法与无序列表的查找算法几乎一样。它无法有序向量那样,进行减治策略的查找,究其原因在于虽然有序列表中各节点在逻辑上按次序单调排列,但在动态存储策略上,节点的物理地址与逻辑次序毫无关系。
复杂度:O(n)
|