單鏈表反轉 後插入和前插入寫法

#include <iostream>

struct node
{
    int value = -1;
    node* next_ptr = nullptr;
};

//創建結點

void create(int i, node** header_ptr) {
    node* current = *header_ptr;
    //第一個結點
    if (current == nullptr) {
        node* ptr = new node;
        ptr->value = i;
        ptr->next_ptr = nullptr;
        *header_ptr = ptr;
    }else {
        while (current!= nullptr){
            if (current->next_ptr == nullptr){
                node* ptr = new node;
                ptr->value = i;
                ptr->next_ptr = nullptr;
                current->next_ptr = ptr;
                break;
            }

            current = current->next_ptr;
        }
    }
}

//反轉鏈表
void rever_list(node** header) {
    if (header == nullptr){
        return;
    }

    node* pre = nullptr;
    node* header_ptr = *header;
    while (header_ptr != nullptr){
        node* temp_ptr = header_ptr->next_ptr;
        header_ptr->next_ptr = pre;
        pre = header_ptr;
        header_ptr = temp_ptr;
    }

    *header = pre;

}

//插入鏈表(後插入法 )
void insert_list_back(node**header, int prev_value,int insert_value)
{
    node* pre = *header;

    while (pre!= nullptr){
        if (pre->value == prev_value){
            node* temp_ptr = new node();
            temp_ptr->value = insert_value;
            if (temp_ptr->next_ptr != nullptr){
                temp_ptr->next_ptr = pre->next_ptr;
                pre->next_ptr = temp_ptr;
            }else {
                pre->next_ptr = temp_ptr;
            }

            break;
        }

        pre = pre->next_ptr;
    }
}

//插入鏈表(前插入法)
void insert_list_fornt(node** header, int prev_value, int insert_value)
{
    //前指針
    node* pre = nullptr;
    node* temp_header = *header;
    //後指針
    node* next = temp_header->next_ptr;

    while (temp_header != nullptr){
        if (next->value ==prev_value){
            //第一節點插入
            if (pre == nullptr){
                node* ptr = new node;
                ptr->value = insert_value;
                ptr->next_ptr = temp_header;
                *header = ptr;
            }else {
                node* ptr = new node;
                ptr->value = insert_value;
                ptr->next_ptr = temp_header;
                pre->next_ptr = ptr; 

                //已經是二級指針了,否則會報錯
               // *header = pre;
            }

            break;
        }

        pre = temp_header;
        temp_header = temp_header->next_ptr;
        next = temp_header->next_ptr;
    }
}

//鏈表刪除

void delete_list(node** header, int value)
{
    node* current_ptr = *header;
    node* pre = nullptr;

    while (current_ptr != nullptr){
        if (current_ptr->value == value){
            //第一個節點刪除
            if (pre == nullptr){
                node* ptr = current_ptr->next_ptr;
                *header = ptr;
            }else {
                node* ptr = current_ptr->next_ptr;
                pre->next_ptr = ptr;
                current_ptr->next_ptr = nullptr;
            }

            delete current_ptr;
            current_ptr = nullptr;
            break;
        }

        pre = current_ptr;
        current_ptr = current_ptr->next_ptr;
    }
}

 

int main()
{
    node* header = new node();
    header->value = 0;
    header->next_ptr = nullptr;
    node* ptr{ nullptr };

    for (int i =1;i<6;++i){
        ptr =create(i, header);
    }


    //插入鏈表(後)
    //insert_list_back(&header,5,6);
    //插入鏈表(前)
    insert_list_fornt(&header, 2, 7);
    int i = 100;
    //反轉鏈表
    //rever_list(&header);

}

//說明:玩單鏈表很簡單,傳參只需要傳二級指針即可,然後去理解每個節點的意思

//記住一定要多敲,否則成不了大神............

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章