c++单向链表
#pragma once
#include <iostream>
template<class T>
class List;
template<class T>
class Node
{
friend class List<T>;
public:
Node(T data) {
this->data = data;
}
private:
T data;
Node *next_node;
};
template<class T>
class List
{
public:
List() {
first = last = new Node<int>(0);
size = 0;
}
void push_back(T data)
{
Node<T>* node = new Node<T>(data);
node->next_node = nullptr;
last->next_node = node;
last = node;
++size;
}
void push_front(T data)
{
Node<T>* node = new Node<T>(data);
node->next_node = nullptr;
node->next_node = first->next_node;
first->next_node = node;
++size;
}
T pop_back()
{
if (first->next_node == nullptr)
return 0;
auto node = first;
auto pre_node = first;
while (node->next_node!= nullptr)
{
pre_node = node;
node = node->next_node;
}
T data = node->data;
delete node;
pre_node->next_node = nullptr;
--size;
return data;
}
T pop_front()
{
if (first->next_node == nullptr)
return 0;
auto node = first->next_node;
T data = node->data;
first->next_node = node->next_node;
delete node;
--size;
return data;
}
void delete_list(T data)
{
auto it = first->next_node;
auto pre_node = first;
while (it!=nullptr)
{
if (it->data == data)
{
if (it == last)
last = pre_node;
pre_node->next_node = it->next_node;
delete it;
--size;
break;
}
pre_node = it;
it = it->next_node;
}
}
void show_list()
{
auto it = first->next_node;
while (it!=nullptr)
{
std::cout << it->data << std::endl;
it = it->next_node;
}
}
void clear()
{
auto node = first->next_node;
first->next_node = nullptr;
Node<T>* q = nullptr;
while (node != nullptr)
{
q = node->next_node;
delete node;
node = q;
}
size = 0;
}
void reverse()
{
if (size<=1)
return;
auto s = first->next_node;
auto p = s->next_node;
last = s;
last->next_node = nullptr;
while (p!=nullptr)
{
s = p;
p = p->next_node;
s->next_node = first->next_node;
first->next_node = s;
}
}
private:
Node<T>* first;
Node<T>* last;
int size =0;
};