链表是比较常见的数据结构了,没有特别需要难理解的地方,主要是实现的时候注意细节就好了。
废话不多说,话都在酒(代码)里。
#include<iostream>
#include<cassert>
using namespace std;
template<class T>
class Node
{
T e;
Node* next;
Node() : next(nullptr) {}
Node(T elem) : e(elem) {}
Node(T elem,Node* ne) : e(elem), next(ne) {}
};
template<class T>
class LinkList
{
private:
Node<T>* head;
int size;
public:
LinkList()
{
head = new Node<T>();
size = 0;
}
int get_size()
{
return size;
}
bool isempty()
{
return size == 0;
}
void insert(int index, T e)
{
assert(index >= 0 && index <= size);
Node<T>* pre = head;
for (int i = 0; i < index; i++)
{
pre = pre->next;
}
pre->next = new Node<T>(e, pre->next);
++size;
}
void insert_front(T e)
{
insert(0, e);
}
void insert_back(T e)
{
insert(size, e);
}
T get(int index)
{
assert(index >= 1 && index <= size);
Node<T>* cur = head;
for (int i = 0; i < index; i++)
{
cur = cur->next;
}
return cur->e;
}
T get_front()
{
return get(1);
}
T get_back()
{
return get(size);
}
void set(int index, T e)
{
assert(index >= 1 && index <= size);
Node<T>* cur = head;
for (int i = 0; i < index; i++)
{
cur = cur->next;
}
cur->e = e;
}
void set_front(T e)
{
set(1, e);
}
void set_back(T e)
{
set(size, e);
}
T remove(int index)
{
assert(index >= 1 && index <= size);
Node<T>* cur = head;
for (int i = 0; i < index - 1; i++)
{
cur = cur->next;
}
T tem = cur->next->e;
cur->next = cur->next->next;
--size;
return tem;
}
T remove_front()
{
remove(1);
}
T remove_back()
{
remove(size);
}
void removeElem(T e)
{
Node<T>* cur = head;
while (cur->next)
{
if (cur->next->e == e) break;
cur = cur->next;
}
if (cur->next)
{
cur->next = cur->next->next;
--size;
}
}
bool contains(T e)
{
Node<T>* cur = head;
while (cur->next)
{
cur = cur->next;
if (cur->e == e) return true;
}
return false;
}
}