#pragma once
#include<iostream>
using namespace std;
#include<assert.h>
template<class T>
struct __ListNode
{
    __ListNode<T>* _prev;
    __ListNode<T>* _next;
    T _data;
    __ListNode(const T&x)
        :_data(x)
        , _prev(NULL)
        , _next(NULL)
    {}
};
template<class T,class Ref,class Ptr>
struct __ListIterator
{
    typedef __ListNode<T> Node;
    typedef __ListIterator<T, Ref, Ptr> Self;
    
    __ListIterator(Node* node)
        :_node(node)
    {}
    __ListIterator()
    {}
        Node* _node;
        Ref operator*()
        {
            return _node->_data;
        }
        
        Ptr operator->()
        {
            return &_node->_data;
        }
        
        bool operator==(const Self&s)const
        {
            return _node == s._node;
        }
        bool operator!=(const Self&s)const
        {
            return _node != s._node;
        }
        Self& operator++()  //前置
        {
            _node = _node->_next;
            return *this;
        }
        Self& operator++(int)
        {
            Self temp(_node);
            _node = _node->_next;
            return *this;
        }
        Self& operator--()
        {
            _node = _node->_prev;
            return *this;
        }
        Self& operator--(int)
        {
            Self tmp(_node);
            _node = _node->_prev;
            return *this;
        }
};
template<class T>
class List
{
    typedef __ListNode<T> Node;
public:
    typedef __ListIterator<T, T&, T*> Iterator;   //迭代器
    typedef __ListIterator<T, const T&, const T*> ConstIterator;   //const迭代器
    Node* Buynode(const T&x)
    {
        Node* node = new Node(x);
        return node;
    }
    List()
    {
        _head = Buynode(T());
        _head->_next = _head;
        _head->_prev = _head;
    }
    //void PushBack(const T&x)
    //{
    //    Node* tail = _head->_prev;
    //    Node* tmp = Buynode(x);
    //    tail->_next = tmp->_next;
    //    tmp->_prev = tail;
    //    tmp->_prev = tail;
    //    tmp->_next = _head;
    //    //    //    tail->_next = tmp;
    //    //    //    tmp->_prev = tail;
    //    //
    //    //    //    tmp->_next = _head;
    //    //    //    _head->_prev = tmp;
    //}
    void PushBack(const T&x)
    {
        Insert(End(),x);
    }
    void PushFront(const T&x)
    {
        Insert(Begin(), x);
    }
    void Pop()
    {
        Erase(--End());
    }
    void PopFront()
    {
        Erase(Begin());
    }
    void Insert(Iterator pos,const T&x)   //在pos前面插入
    {
        Node* cur = pos._node;
        Node* prev = cur->_prev;  //在prev后面插入
        Node* tmp = Buynode(x);
        prev->_next = tmp->_next;
        tmp->_prev = prev;
        prev->_next = tmp;
        tmp->_next = cur;
        //        tmp->_next = cur;
        //        cur->_prev = tmp;
        //
        //        prev->_next = tmp;
        //        tmp->_prev = prev;
    }
    void Erase(Iterator pos)  //在pos前面删除
    {
        assert(pos != End());
        Node* cur = pos._node->_prev;  //要删除的元素
        Node* prev = cur->_prev;
        
        prev->_next = cur->_next;
        prev->_next = prev;
        delete cur;
    }
    Iterator Begin()
    {
        return Iterator(_head->_next);
    }
    Iterator End()
    {
        return Iterator(_head);
    }
private:
    Node* _head;
};
void main()
{
    //TestList();
    List<int> l;
    l.PushBack(1);
    l.PushBack(2);
    l.PushBack(3);
    l.PushBack(4);
    List<int>::Iterator it = l.Begin();
    while (it != l.End())
    {
        cout << *it << " ";
        ++it;
    }
    cout << endl;
}
原文:http://www.cnblogs.com/qingjiaowoxiaoxioashou/p/5873599.html