List::去重,倒置

無序去重:

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); //交換對稱節點的數據項
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章