天天看點

單連結清單反轉和插入

#include

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);

}

//說明:玩單連結清單很簡單,傳參隻需要傳二級指針即可,然後去了解每個節點的意思

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

c++

繼續閱讀