链表

#ifndef NODE_H
#define NODE_H
template <typename T>
class node{
public:
    T data;
    node<T> *next;
public:
    node(T _data=0)
        : data(_data),next(nullptr){}
};
#endif // NODE_H
#ifndef LINK_H
#define LINK_H
#include <iostream>
#include "Node.h"
using namespace std;

template <typename T>
class Link
{
public:
    Link()
    {
        head = new node<T>;
        length = 0;
    }

    Link(int num)
    {
        head = new node<T>;
        length = 0;
        for(int i=0;i<num;i++)
            insert(0);
    }

    virtual ~Link()
    {
        int _length = length;
        for(int i=0;i<_length;i++)
        {
            erase(0);
        }
        delete head;
    }

    Link(const Link& rhs)
    {
        head = new node<T>;
        length = 0;
        node<T> *_node = rhs.head;
        for(int i=0;i<rhs.length;i++)
        {
            insert(_node->next->data);
            _node = _node->next;
        }
    }

    Link& operator=(const Link& rhs)
    {
        if(this == &rhs) return *this;

        int _length = this->length;
        for(int i=0;i<_length;i++)
        {
            erase(0);
        }
        head->next = nullptr;
        node<T> *_node = rhs.head;
        for(int i=0;i<rhs.length;i++)
        {
            insert(_node->next->data);
            _node = _node->next;
        }
        return *this;
    }
public:
    void insert(const T&_data)
    {
        insert(_data,length);
    }

    void insert(const T&_data,int index)
    {
        if(index < 0 || index > length)
            return;
        node<T> *new_node = new node<T>(_data);
        if(index == 0)
        {
            new_node->next = head->next;
            head->next = new_node;
        }
        else if(index == length)
        {
            node<T> *_back = this->end();
            _back->next = new_node;
        }
        else
        {
            node<T> *_prev = find(index-1);
            new_node->next = _prev->next;
            _prev->next = new_node;
        }
        length++;
    }

    void erase(int index)
    {
        if(index < 0 || index >= length)
            return;
        if(length <= 0)
            return;
        if(index == 0)
        {
            node<T> *del_node = head->next;
            head->next = del_node->next;
            delete del_node;
        }
        else if(index == length-1)
        {
            node<T> *prev = find(index-1);
            node<T> *del_node = find(index);
            prev->next = nullptr;
            delete del_node;
        }
        else
        {
            node<T> *prev = find(index-1);
            node<T> *del_node = find(index);
            prev->next = del_node->next;
            delete del_node;
        }
        length--;
    }

    void push_back(const T&_data)
    {
        insert(_data,length);
    }

    void push_front(const T&_data)
    {
        insert(_data,0);
    }

    void pop_back()
    {
        erase(length-1);
    }

    void pop_front()
    {
        erase(0);
    }

    node<T>* find(const int index)
    {
        if(index < 0 || index >= length)
            return nullptr;
        int _index = index;
        node<T> *_node = head;
        while(_index >= 0)
        {
            _node = _node->next;
            _index--;
        }
        return _node;
    }

    node<T>* begin()
    {
        if(empty())
            return nullptr;
        return find(0);
    }

    node<T>* end()
    {
        if(empty())
            return nullptr;
        int _length = length-1;
        return find(_length);
    }

    inline int size() const
    {
        return length;
    }

    inline bool empty() const
    {
        if(length == 0)
            return true;
        return false;
}

    friend ostream& operator <<(ostream &os,
                                const Link<T> &list)
    {
        node<T> *_node = list.head->next;
        while(_node != nullptr)
        {
            os << _node->data << ",";
            _node = _node->next;
        }
        os << std::endl;
        return os;
    }

    T &front()
    {
        return begin()->data;
    }

    T &back()
    {
        return end()->data;
    }

    void inverse()//逆置
    {
        if(empty()) return;
        node<T>* p = head;
        node<T>* s = p->next;
        while(s->next != nullptr)
        {
            node<T> *t = s->next;
            s->next=p;
            p=s;
            s=t;
        }
        s->next = p;
        head->next->next=nullptr;
        head->next=s;
    }
private:
   node<T> *head;
   int length;
};

#endif // LINK_H

 

转载于:https://www.cnblogs.com/zhaozhaodeboke/p/6670590.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值