#include<iostream>
using namespace std;

//节点

template <typename T>
struct node
{
    T value;
    node *prev;
    node *next;
    node(){};
    node(T t, node *prev, node *next){
        this->value = t;
        this->prev = prev;
        this->next = next;
    }
};

//链表

template<typename T>
class Link
{
public:
    Link();
    ~Link();

    int size();                                //输出总的长度
    bool is_empty();                            //判断是否为空

    T get(int index);                        //指定位置输出
    T get_first();                            //输出第一个元素
    T get_last();                            //输出最后一个元素

    void insert(int index, T t);                //按指定位置插入
    void insert_first(T t);                    //头插法
    void insert_last(T t);                    //尾插法

    T del(int index);                        //指定位置删除
    T delete_first();                        //删除头元素
    T delete_last();                        //删除最后一个元素

private:
    int count;        //元素的个数
    node<T> *head;
private:
    node<T>* get_node(int count);
};

template <typename T>
Link<T>::Link(){
    count = 0;
    //创建表头,没有数据
    head = new node<T>();
    head->prev = head->next = head;
}

//析构函数
template<typename T>
Link<T>::Link()
{
    //删除所有节点
    node<T> *temp;
    node<T> *p = head->next;
    while (p != head)
    {
        temp = p;
        p = p->next;
        delete temp;
    }
    //删除表头
    delete head;
    head = NULL;
}

//输出总的长度
template <typename T>
int Link<T>::size(){
    return count;
}

//返回链表是否为空
template <typename T>
bool Link<T>::is_empty()
{
    return count == 0;
}

//获取第index位置的节点
template <class T>
node<T>* Link<T>::get_node(int index){
    //判断参数有效性
    if (index < 0 || index >= count){
        throw:"index异常!";
        return NULL;
    }
    //正向查找
    if (inde <= count / 2){
        int i = 0;
        node<T>*p = head->next;
        while (i++ < index){
            p = p->next;
        }
        return p;
    }
    else{
        int i = 0, rindex=count-index-1;
        node<T> *p = head->prev;
        while (i++ < rindex){
            p = p->prev;
        }
        return p;
    }
}

//获取第index位置的节点的值
template<typename T>
T Link<T>::get(int index){
    return get_node(index)->value;
}

//获得最后一个节点的值
template<typename T>
T Link<T>::get_last()
{
    return get_node(count - 1)->value;
}

//将节点插入到第index位置之前
template <typename T>
void Link<T>::insert(int index, T t)
{
    if (index == 0) insert_first(t);
    node<T>*pindex = get_node(index);
    node<T>*p = new node<T>(t, pindex->prev, pindex);        //插入到index的前边,把index的前驱给它,index的地址为next
    pindex->prev->next = p;        pindex->prev = p;
    ++count;
}

//将节点插入第一个节点处
template<typename T>
void Link<T>::insert_first(T t)
{
    node<T>* p = new node<T>(t, head, head->next);
    head->next->prev = p;
    head->next = p;
}

//将节点追加到链表的末尾
template<typename T>
void Link<T>::insert_last(T t)
{
    node<T>*p = new node<T>(t, head->prev, head);
    head->prev->next = p;
    head->prev = p;
    ++count;
}

//删除index位置的节点
template<typename T>
T Link<T>::del(int index)
{
    node<T>*pindex = get_node(index);
    pindex->prev->next = pindex->next;
    pindex->next->prev = pindex->prev;
    T data = pindex->value;
    delete pindex;
    return data;
}

//删除第一个节点
template<typename T>
T Link<T>::delete_first(){
    retrun del(0);
}

//删除最后一个节点
template<typename T>
T Link<T>::delete_last()
{
    return del(count - 1);
}