#include<iostream>
using namespace std;
namespace mylist
{
template<class T>
struct ListNode
{
ListNode(const T& val = T()):_val(val),_pPre(nullptr),_pNext(nullptr){}
ListNode<T>* _pPre;
ListNode<T>* _pNext;
T _val;
};
template<class T, class Ref, class Ptr>
class ListIterator
{
typedef ListNode<T>* PNode;
typedef ListIterator<T, Ref, Ptr> Self;
public:
PNode node()
{
return _pNode;
}
ListIterator(PNode pNode = nullptr):_pNode(pNode){}
ListIterator(const Self& l):_pNode(l._pNode){}
T& operator*()
{
return _pNode->_val;
}
T* operator->()
{
return _pNode;
}
Self& operator++()
{
_pNode = _pNode->_pNext;
return *this;
}
Self operator++(int)
{
Self p = *this;
_pNode = _pNode->_pNext;
return Self(p);
}
Self& operator--()
{
_pNode = _pNode->_pPre;
return *this;
}
Self& operator--(int)
{
Self p = *this;
_pNode = _pNode->_pPre;
return Self(p);
}
bool operator!=(const Self& l) const
{
return _pNode != l._pNode;
}
bool operator==(const Self& l) const
{
return _pNode == l._pNode;
}
private:
PNode _pNode;
};
template<class Iterator, class Ref, class Ptr>
struct Reverse_iterator
{
typedef Reverse_iterator<Iterator, Ref, Ptr> Self;
Reverse_iterator(Iterator it):_it(it){}
Ref operator*()
{
Iterator t(_it);
return *t;
}
Ptr operator->()
{
return &(operator*());
}
//
// 迭代器支持移动
Self& operator++()
{
Self temp(*this);
--_it;
return temp;
}
Self operator++(int)
{
Self temp(*this);
--_it;
return temp;
}
Self& operator--()
{
++_it;
return *this;
}
Self operator--(int)
{
Self temp(*this);
++_it;
return temp;
}
bool operator!=(const Self& l) const
{
return _it != l._it;
}
bool operator==(const Self& l) const
{
return _it != l._it;
}
Iterator _it;
};
template<class T>
class list
{
typedef ListNode<T> Node;
typedef Node* PNode;
public:
typedef ListIterator<T, T&, T*> iterator;
typedef ListIterator<T, const T&, const T&> const_iterator;
typedef Reverse_iterator<iterator, const T&, const T*> const_Reverse_iterator;
typedef Reverse_iterator<iterator,T&,T*> Reverse_iterator;
public:
list()
{
CreateHead();
}
list(int n, const T& value = T())
{
CreateHead();
while(n--)
push_front(value);
}
template <class Iterator>
list(Iterator first, Iterator last)
{
CreateHead();
while (first != last)
{
push_back(*first);
first++;
}
}
list(const list<T>& l)
{
CreateHead();
for (auto it : l)
{
push_back(it);
}
}
list<T>& operator=(const list<T> l)
{
CreateHead();
for (auto it : l)
{
push_back(it);
}
}
~list()
{
clear();
delete _pHead;
_pHead = nullptr;
}
///
// List Iterator
iterator begin() { return iterator(_pHead->_pNext); }
iterator end() {return iterator(_pHead);};
const_iterator begin() const { return const_iterator(_pHead->_pNext); }
const_iterator end() const { return const_iterator(_pHead); }
Reverse_iterator rbegin()
{
return Reverse_iterator(--end());
}
Reverse_iterator rend()
{
return Reverse_iterator(--begin());
}
const_Reverse_iterator rbegin()const
{
return const_Reverse_iterator(--end());
}
const_Reverse_iterator rend()const
{
return const_Reverse_iterator(--begin());
}
///
// List Capacity
size_t size()const
{
size_t s = 0;
const_iterator it = this->begin();
while (it != this->end())
{
it++;
s++;
}
return s;
}
bool empty()const
{
return _pHead == _pHead->_pNext;
}
// List Access
T& front() { return _pHead->_pNext->_val; }
const T& front()const { return _pHead->_pNext->_val; }
T& back() { return _pHead->_pPre->_val; }
const T& back()const { return _pHead->_pPre->_val; }
// List Modify
void push_back(const T& val) { insert(end(), val); }
void pop_back() { erase(--end()); }
void push_front(const T& val) { insert(begin(), val); }
void pop_front() { erase(begin()); }
// 在pos位置前插入值为val的节点
iterator insert(iterator pos, const T& val)
{
PNode tmp = new Node(val);
tmp->_pNext = pos.node();
tmp->_pPre = pos.node()->_pPre;
pos.node()->_pPre->_pNext = tmp;
pos.node()->_pPre = tmp;
return iterator(tmp);
}
// 删除pos位置的节点,返回该节点的下一个位置
iterator erase(iterator pos)
{
PNode it = pos.node()->_pNext;
PNode p = pos.node();
p->_pNext->_pPre = p->_pPre;
p->_pPre->_pNext = p->_pNext;
delete p;
return iterator(it);
}
void clear()
{
while (_pHead != _pHead->_pNext)
{
pop_front();
}
}
void swap(list<T>& l)
{
PNode tmp = l._pHead;
l._pHead = _pHead;
_pHead = tmp;
}
private:
void CreateHead()
{
_pHead = new Node;
_pHead->_pNext = _pHead;
_pHead->_pPre = _pHead;
}
PNode _pHead;
};
};