template<typename datatype>
class my_list
{
class list_data
{
public:
datatype m_data;
list_data* m_before;
list_data* m_next;
list_data()
{
this->m_before = nullptr;
this->m_next = nullptr;
this->m_data = NULL;
}
list_data(datatype data)
{
this->m_before = nullptr;
this->m_next = nullptr;
this->m_data = data;
}
};
int m_size;
bool is_empty;
list_data* m_end;
list_data* m_begin;
list_data* m_list;
public:
class iterator
{
public:
list_data* m_it;
iterator(list_data* list)
{
m_it = list;
}
iterator(const iterator &it)
{
this->m_it = it.m_it;
}
iterator operator ++(int)
{
list_data* temp = m_it;
m_it = m_it->m_next;
return temp;
}
iterator operator ++()
{
m_it = m_it->m_next;
return m_it;
}
iterator operator --(int)
{
list_data* temp = m_it;
m_it = m_it->m_before;
return temp;
}
iterator operator --()
{
m_it = m_it->m_before;
return m_it;
}
bool operator !=(iterator& it)
{
return this->m_it != it.m_it;
}
bool operator !=(list_data* list)
{
return this->m_it != list;
}
bool operator !=(const iterator& it)const
{
return this->m_it != it.m_it;
}
bool operator !=(const list_data* list)const
{
return this->m_it != list;
}
datatype operator *()
{
return m_it->m_data;
}
iterator operator =(iterator it)
{
m_it = it.m_it;
return this;
}
iterator operator =(list_data* list)
{
m_it = list;
return this;
}
};
my_list()
{
m_list= new list_data();
m_begin = m_list;
m_end = m_list;
this->m_size = 0;
this->is_empty = true;
}
my_list(datatype data)
{
this->is_empty = false;
m_size = 1;
m_list = new list_data(data);
m_list->m_next = new list_data();
m_end = this->m_list;
m_begin = this->m_list;
}
int size()
{
return m_size;
}
void push_back(datatype nextdata)
{
++m_size;
this->is_empty = false;
if (m_list->m_next==nullptr)
{
m_list->m_next = new list_data();
m_list->m_data = nextdata;
m_end = m_list;
m_begin = m_list;
return;
}
m_end->m_next->m_data = nextdata;
this->m_end->m_next->m_before = m_end;
this->m_end = this->m_end->m_next;
this->m_end->m_next = new list_data();
}
void pop_back()
{
delete m_end->m_next;
m_end->m_next = nullptr;
if (m_end->m_before != nullptr)
{
this->m_end = m_end->m_before;
}
else
{
delete m_begin;
m_list = new list_data();
m_begin = m_list;
m_end = m_list;
this->is_empty = true;
}
--m_size;
}
void pop_front()
{
m_begin = m_begin->m_next;
delete this->m_list;
this->m_list = this->m_begin;
--this->m_size;
}
bool empty()
{
return this->is_empty;
}
void clear()
{
while (!this->is_empty)
{
pop_back();
}
}
iterator begin()
{
return iterator(m_begin);
}
iterator end()
{
return iterator(m_end->m_next);
}
void insert(iterator iter, datatype i)
{
list_data* temp_next = iter.m_it->m_next;
iter.m_it->m_next->m_before = nullptr;
iter.m_it->m_next = nullptr;
iter.m_it->m_next = new list_data(i);
iter.m_it->m_next->m_next = temp_next;
iter.m_it->m_next->m_before = iter.m_it;
temp_next->m_before = iter.m_it->m_next;
++this->m_size;
}
void insert(iterator iter, datatype i, int times)
{
for (int m_i = 0; m_i < times; m_i++)
{
insert(iter,i);
}
}
};