链表之单链表

链表属于顺序结构,是最简单的一种,主要包括,链表是插入、删除、查询等

这里以指针的形式,并结合模板类方法
定义节点

template<typename T>
struct Node{

public:
    Node(T value, Node<T> *next):
    value(value), next(next){}
    Node(T value): value(value){}
    Node(){}

public:
    T value;
    Node<T>* next;
};

// 声明单链表 模板类
template <typename T>
class SingleLink
{
public:
    SingleLink();
    ~SingleLink(){};

    // 表头插入
    void insert_head(T val);

    // 尾部插入
    void insert_end(T val);

    // 在某个位置插入
    void insert(int i, T val);

    // 移除
    void remove(int i);

    // 是否为空
    bool isEmpty() {return count == 0;}

    // 链表长度
    int size() const{return count;}

    //
    T getValue(int i);

    void printLink();

private:
    int count;
    Node<T> *phead; // 头指针

    Node<T>* getNode(int i); // 根据索引获得链表节点

};


// 定义单链表


template <typename T>
SingleLink<T>::SingleLink()
{
    count = 0;
    phead = new Node<T>(0, nullptr);
}

template<typename T>
void SingleLink<T>::insert_head(T val){
   Node<T> *newNode = new Node<T>(val, nullptr);
      newNode->next = phead->next;
      phead->next = newNode;
      count ++;
}

template<typename T>
void SingleLink<T>::insert_end(T val){
    Node<T> *newNode = new Node<T>(val, nullptr);
    Node<T> *node = getNode(count);
    if (node != nullptr){
       newNode->next = node->next;
       node->next = newNode;
       count ++;
    }
}
template<typename T>
void SingleLink<T>::insert(int i, T val){
    Node<T> *newNode = new Node<T>(val, nullptr);
    Node<T> *node = getNode(i);
    if (node != nullptr){
       newNode->next = node->next;
       node->next = newNode;
       count ++;
    }
}

template<typename T>
void SingleLink<T>::remove(int i){
    Node<T> *node = getNode(i);
    if (node != nullptr && node->next!=nullptr){
        node->next = node->next->next;
        count --;
    }
}


// 头指针不算个数,索引都是从0开始,范围上一个节点
template<typename T>
Node<T>* SingleLink<T>::getNode(int i){
    if(i > count){
        return nullptr;
    }
    int index =0;
    Node<T> *node = phead;
    while (index < i) {
        node = node->next;
        index++;
    }
    return node;
}

template<typename T>
T SingleLink<T>::getValue(int i){
    Node<T> *node = getNode(i);
    if (node!=nullptr && node->next!=nullptr){
        return node->next->value;
    }
}

template<typename T>
void SingleLink<T>::printLink(){
    using namespace std;
    Node<T> *node = phead;
    while (node->next!=nullptr) {
        node = node->next;
        T value = node->value;
        cout<< value << " ";
    }
    cout << endl;
}


发布了24 篇原创文章 · 获赞 4 · 访问量 8290

猜你喜欢

转载自blog.csdn.net/zhaitianyong/article/details/104717767