数据结构c++双向链表(首尾指针)
- 插入操作
#pragma once
#include <iostream>
using namespace std;
template <class T>
class DoubleLinkList;
template <class T>
class Node
{
public:
Node(T data)
{
this->data = data;
pre = nullptr;
next = nullptr;
}
friend class DoubleLinkList<T>;
friend ostream& operator<<(ostream& os, Node<T>* node)
{
return os << node->data;
}
private:
T data;
Node<T> *pre;
Node<T> *next;
};
template <class T>
class DoubleLinkList
{
public:
DoubleLinkList()
{
first = last = new Node<T>(-1);
size = 0;
}
bool is_empyt()
{
if (size == 0)
return true;
return false;
}
void Clear()
{
if (is_empyt())
return;
auto p = first->next;
Node<T>* temp = nullptr;
while (p!=last)
{
temp = p;
delete temp;
p = p->next;
}
last = first;
size = 0;
}
void show_list()
{
if (is_empyt())
return;
auto p = first->next;
while (p != nullptr)
{
cout << p;
p = p->next;
}
}
Node<T>* get_node(int index)
{
if (is_empyt())
return nullptr;
if (index<0 || index>size)
return nullptr;
auto p = first->next;
for (int i=0;i<size;++i)
{
if(i==index)
break;
p = p->next;
}
return p;
}
void insert_index(T data, int index)
{
if (index<0 || index>size)
return;
auto node = new Node<T>(data);
if (size == 0)
{
node->pre = first;
first->next = node;
last = node;
}
else if (index == 0)
{
node->pre = first;
node->next = first->next;
first->next->pre = node;
first->next = node;
}
else if(index == size)
{
last->next = node;
node->pre = last;
last = node;
}
else
{
auto pre_node = get_node(index-1);
node->pre = pre_node;
node->next = pre_node->next;
pre_node->next->pre = node;
pre_node->next = node;
}
++size;
}
void push_back(T data)
{
insert_index(data, size);
}
void push_front(T data)
{
insert_index(data, 0);
}
T pop_index(int index)
{
if (index<0 || index>size-1)
return -1;
Node<T>* node = nullptr;
if (index == 0)
{
node = first->next;
first->next = node->next;
node->pre = first;
if (size == 1)
last = first;
}
else if (index == size-1)
{
node = last;
last = last->pre;
last->next = nullptr;
}
else
{
node = get_node(index);
node->pre->next = node->next;
node->next->pre = node->pre;
}
T data = node->data;
delete node;
--size;
return data;
}
T pop_back()
{
return pop_index(size-1);
}
T pop_front()
{
return pop_index(0);
}
private:
Node<T>* first;
Node<T>* last;
int size;
};