Once in the beginnings he wrote this. May be useful. ps. Destructor still have to write yourself. And there are extra things. Understand, I think you need.
template <typename valueType> class List { // конструктор List(valueType Value = 0, List *Next = NULL) { this->Value = Value; this->Next = Next; } void Clone(List *to) { } // Возврат длины списка unsigned int GetLength() { unsigned int i = 1; List *tmp = this; while(tmp->Next) { tmp = tmp->Next; ++i; } return i; } // Возврат значения по номеру valueType GetValue(unsigned int index) { if(!index) return this->Value; List *tmp = this; for(unsigned int i = 0; i < index; ++i) tmp = tmp->Next; return tmp->Value; } // Вставка значения в начало списка void Put(valueType Value) { List *newValue = new List(this->Value, this->Next); this->Value = Value; this->Next = newValue; } // Вставка узла в начало списка List *Put(List *node) { node->Next = this; return node; } // Вставка значения по индексу void Insert(valueType Value, unsigned int index) { List *newValue = new List(Value); if(!index) { newValue->Value = this->Value; newValue->Next = this->Next; this->Value = Value; this->Next = newValue; return; } List *tmp = this; --index; for(unsigned int i = 0; i < index; ++i) tmp = tmp->Next; newValue->Next = tmp->Next; tmp->Next = newValue; } // Вставка значения в конец списка void Append(valueType Value) { List *newValue = new List(Value); List *tmp = this; while(tmp->Next) tmp = tmp->Next; tmp->Next = newValue; } // Удаление из списка по номеру void Delete(unsigned int index) { List *tmp = this; if(!index) { tmp = this->Next; this->Value = this->Next->Value; this->Next = this->Next->Next; delete tmp; return; } List *tmpDeleted; for(int i = 0; i < index - 1; ++i) tmp = tmp->Next; tmpDeleted = tmp->Next; tmp->Next = tmp->Next->Next; delete tmpDeleted; } // перестановка элементов List *Move(int from, int to) { List *newHead = this, *tmp = this, *tmpMoved, *tmpHead; int i = 0; // Вырезать элемент, который надо переместить if(from) { for(--from; i < from; ++i) tmp = tmp->Next; tmpMoved = tmp->Next; tmp->Next = tmp->Next->Next; // Чтобы лишний раз не перемещаться по списку if(from > to - 1) { tmp = newHead; i = 0; } } else // Если надо переместить голову { tmpMoved = tmp; newHead = newHead->Next; } // Если надо переместить в начало if(!to) { tmpHead = newHead; newHead = tmpMoved; newHead->Next = tmpHead; return newHead; } // Переместить на нужную позицию for(--to; i < to; ++i) tmp = tmp->Next; tmpHead = tmp->Next; tmp->Next = tmpMoved; tmp->Next->Next = tmpHead; return newHead; } // Поиск элемента в массиве возврат индекса, если нет вхождений возврат -1 int FindValue(valueType Value, unsigned int from = 0) { List *tmp = this; int i = 0; for(; i < from; ++i) tmp = tmp->Next; for(; tmp; tmp = tmp->Next) { if(Value == tmp->Value) return i; ++i; } return -1; } // Поиск максимального элемента, возврат адреса List *FindMax(List **beforeMax = NULL) { List *maxNode = this; List *tmp = this->Next; List *beforeTmp = this; for(; tmp; tmp = tmp->Next) { if(maxNode->Value < tmp->Value) { *beforeMax = beforeTmp; maxNode = tmp; } beforeTmp = beforeTmp->Next; } if(maxNode == this) *beforeMax = NULL; return maxNode; } // Поиск максимального элемента, возврат индекса unsigned int FindMax(unsigned int from = 0) { valueType maxValue = this->Value; List *tmp = this->Next; unsigned int maxIndex = from, i = 1; if(from) { for(; i < from; ++i) tmp = tmp->Next; maxValue = tmp->Value; } for(; tmp; tmp = tmp->Next) { if(maxValue < tmp->Value) { maxValue = tmp->Value; maxIndex = i; } ++i; } return maxIndex; } // Поиск минимального элемента, возврат индекса unsigned int FindMin(unsigned int from = 0) { valueType minValue = this->Value; List *tmp = this->Next; unsigned int minIndex = from, i = 1; if(from) { for(; i < from; ++i) tmp = tmp->Next; minValue = tmp->Value; } for(; tmp; tmp = tmp->Next) { if(minValue > tmp->Value) { minValue = tmp->Value; minIndex = i; } ++i; } return minIndex; } // Сортировка по возрастанию List *SortByAsc() { List *tmp = this; List *max; List *maxPrev; List *newHead; max = tmp->FindMax(&maxPrev); if(maxPrev) maxPrev->Next = max->Next; else tmp = tmp->Next; max->Next = NULL; newHead = max; while(tmp) { max = tmp->FindMax(&maxPrev); if(maxPrev) maxPrev->Next = max->Next; else tmp = tmp->Next; newHead = newHead->Put(max); } return newHead; } // Сортировка по убыванию List *SortByDesc() { List *newHead = this; unsigned int min = newHead->FindMin(); unsigned int i = 1, length = this->GetLength(); if(min) newHead = newHead->Move(min, 0); while(i < length) { min = newHead->FindMin(i); newHead = newHead->Move(min, 0); ++i; } return newHead; } // Построчный вывод значений элементов массива void ShowList() { List *tmp = this; for(unsigned int i = 0; tmp; tmp = tmp->Next, ++i) cout << "Value[" << i << "] = " << tmp->Value << endl; } valueType Value; List *Next; };