無序去重:
template <typename T> int List<T>::deduplicate() { //剔除無序列表中的重複節點
if (_size < 2) return 0; //平凡列表自然無重複
int oldSize = _size; //記錄原規模
ListNodePosi(T) p = header; Rank r = 0; //p從首節點開始
while (trailer != (p = p->succ)) { //依次直到末節點
ListNodePosi(T) q = find(p->data, r, p); //在p的r個(真)前驅中查找雷同者
q ? remove(q) : r++; //若的確存在,則刪除之;否則秩加一
} //assert: 循環過程中的任意時刻,p的所有前驅互不相同
return oldSize - _size; //列表規模變化量,即被刪除元素總數
}
有序去重(兩兩比較):
template <typename T> int List<T>::uniquify() { //成批剔除重複元素,效率更高
if (_size < 2) return 0; //平凡列表自然無重複
int oldSize = _size; //記錄原規模
ListNodePosi(T) p; ListNodePosi(T) q; //依次指向緊鄰的各對節點
for (p = header, q = p->succ; trailer != q; p = q, q = q->succ) //從自左向右掃描
if (p->data == q->data) { remove(q); q = p; } //若p和q雷同,則刪除後者
return oldSize - _size; //列表規模變化量,即被刪除元素總數
}
前後倒置:
template <typename T> void List<T>::reverse() { //前後倒置
ListNodePosi(T) p = header; ListNodePosi(T) q = trailer; //頭、尾節點
for (int i = 1; i < _size; i += 2) //(從首、末節點開始)由外而內,捉對地
swap((p = p->succ)->data, (q = q->pred)->data); //交換對稱節點的數據項
}