美文网首页
用C/C++实现LinkedList

用C/C++实现LinkedList

作者: HardMan | 来源:发表于2021-08-31 19:04 被阅读0次
//
// Created by issuser on 2021/8/30.
//

#include <string.h>
#include <assert.h>
#include <android/log.h>

template <class E>
struct Node{
    Node<E>* next;
    Node<E>* prev;
    E value;
public:
    Node<E>(E value,Node<E>* prev,Node<E>* next){
        this->value=value;
        this->next=next;
        this->prev=prev;

    }
};

template <class E>
class LinkedList{
    Node<E>* head=NULL;
    Node<E>* last=NULL;
    int size;


public:
    void push(E e);

    ~LinkedList();

    Node<E>* node(int index);

    E getValue(int index);

    void insert(int index,E value);

    E remove(int index);

    E getLast();

    E removeLast();

    void printLog();



};

template<class E>
void LinkedList<E>::push(E e) {
    Node<E>* newNode=new Node<E>(e,NULL,NULL);
    if(head!=NULL){
        newNode->prev=last;
        last->next=newNode;
        last=newNode;
    }else{
        head=newNode;
        last=newNode;
    }


    size++;
}

template<class E>
Node<E> *LinkedList<E>::node(int index) {
    assert(index>=0&&index<size);

    if(index<=size/2){
        Node<E>* node1=head;
        for(int i=0;i<index;i++){
            node1=node1->next;
        }
        return node1;
    } else{

        Node<E>* node1=last;

        for(int i=size-1;i>index;i--){
            node1=node1->prev;
        }
        return node1;

    }


}

template<class E>
E LinkedList<E>::getValue(int index) {
    Node<E>* node1=node(index);
    return node1->value;
}

template<class E>
void LinkedList<E>::insert(int index,E value) {
    Node<E>* newNode=new Node<E>(value,NULL,NULL);
    if(index=0){
        newNode->next=head;
        head->prev=newNode;
        head=newNode;

    } else{
        Node<E>* pre=node(index-1);

        Node<E>*next=node(index);

        pre->next=newNode;
        newNode->prev=pre;

        newNode->next=next;
        next->prev=newNode;

    }

    size++;

}

template<class E>
E LinkedList<E>::remove(int index) {
    assert(index>=0&&index<size);

    if(size==1){
        E value=head->value;
        delete head;
        delete last;
        head=NULL;
        last=NULL;
        size--;
        return value;
    }


    if(index==0){
        Node<E>* deleteNode=head;
        E value=deleteNode->value;
        head=head->next;

        head->prev=NULL;
        deleteNode->next=NULL;


        delete deleteNode;
        size--;
        return value;
    }

    if(index==size-1){
        Node<E>* deletenOde=node(size-1);
        E value=deletenOde->value;

        last=deletenOde->prev;

        last->next=NULL;
        deletenOde->prev=NULL;
        delete  deletenOde;
        size--;
        return value;

    }

    Node<E>* deletNode=node(index);

    Node<E>* prev=deletNode->prev;
    Node<E>* next=deletNode->next;

    prev->next=next;
    next->prev=prev;


    E value=deletNode->value;

    delete  deletNode;
    size--;

    return value;
}

template<class E>
E LinkedList<E>::getLast() {
    return last->value;
}

template<class E>
E LinkedList<E>::removeLast() {
    return remove(size--);
}

template<class E>
void LinkedList<E>::printLog() {
    Node<E>* node1=head;
    for(int i=0;i<size;i++){
        __android_log_print(ANDROID_LOG_ERROR,"LIST","index=%d,value=%d",i,node1->value);
        node1=node1->next;

    }

}



LinkedList 使用双向链表 相较于单向链表,在性能上更出色,主要体现在两个地方

push 方法。双向链表由于有一个尾节点指针,每次只要在尾节点中添入即可。因此它的时间是O1 常量级。
单向链表则每次来从头节点移动到尾节点,因此时间是On

get方法。双向链表 可以根据index更靠近首节点还是尾节点 来选择从首节点向下遍历还是尾节点向上遍历。因此它的时间平均是单节点的一半。

相关文章

网友评论

      本文标题:用C/C++实现LinkedList

      本文链接:https://www.haomeiwen.com/subject/iioziltx.html