定义Node节点,使用泛型
template <class T>
struct LinkedNode {
LinkedNode() :value(0), next(NULL) {}
LinkedNode(T v, LinkedNode* node) : value(v), next(node) {}
~LinkedNode() {}
T value;
LinkedNode* next;
};
链表的类定义
template <class T>
class LinkedList {
public:
LinkedList() :dummyHead(NULL), tail(NULL), maxSize(0) {}
void initLinkedList() {
dummyHead = new LinkedNode<T> ();
assert(dummyHead != NULL);
}
bool add(int index, const T& v);
bool addFirst(const T& v);
bool addLast(const T& v);
bool remove(int index, T& v);
bool removeFirst(T& v);
bool removeLast(T& v);
int getSize() { return maxSize; }
bool isEmpty() { return maxSize == 0; }
template <class T>
friend std::ostream& operator<< (std::ostream& out, LinkedList<T>*& list);
private:
LinkedNode<T>* dummyHead;
LinkedNode<T>* tail;
int maxSize;
};
template <class T>
bool LinkedList<T>::add(int index, const T& v) {
if (index < 0 || index > maxSize) {
return false;
}
if (dummyHead == NULL) {
initLinkedList();
}
LinkedNode<T>* prev = dummyHead;
for (int i = 0; i < index; i++) {
prev = prev->next;
}
prev->next = new LinkedNode<T>(v, prev->next);
maxSize++;
return true;
}
template <class T>
bool LinkedList<T>::addFirst(const T& v) {
return add(0, v);
}
template <class T>
bool LinkedList<T>::addLast(const T& v) {
return add(maxSize, v);
}
template <class T>
std::ostream& operator<< (std::ostream& out, LinkedList<T>*& list) {
if (list == NULL || list->maxSize == 0) {
return out;
}
out << "[ ";
LinkedNode<T>* cur = list->dummyHead->next;
for (int i = 0; i < list->maxSize; i++) {
out << cur->value << " ";
cur = cur->next;
}
out << "]" << std::endl;
return out;
}
template <class T>
bool LinkedList<T>::remove(int index, T& v) {
if (index < 0 || index > maxSize) {
return false;
}
LinkedNode<T>* prev = dummyHead;
for (int i = 0; i < index - 1; i++) {
prev = prev->next;
}
LinkedNode<T>* cur = prev->next;
prev->next = cur->next;
v = cur->value;
delete cur;
maxSize--;
return true;
}
template <class T>
bool LinkedList<T>::removeFirst(T& v) {
return remove(0, v);
}
template <class T>
bool LinkedList<T>::removeLast(T& v) {
return remove(maxSize, v);
}
这里的tail暂时不用到,也就没有定义了,如果需要链表实现队列,可以对此类进行修改