/**
*
* File Name: LinkedList.hpp
* brief:单链表
* author:Patrick
* Create Time: 2019年01月16日 17:49:56
*
*/
#pragma once
#include <iostream>
#include <sstream>
using namespace std;
template<typename T>
class Node
{
public:
~Node()
{}
T data;
Node<T>* next{nullptr};
};
template<typename DATA_TYPE = int32_t>
class LinkedList
{
public:
LinkedList();
~LinkedList();
/**
* \brief 销毁链表
*/
void destory();
/**
* \brief 尾插
*/
void push_back(DATA_TYPE e);
/**
* \brief 头插
*/
void push_front(DATA_TYPE e);
/**
* \brief 头插
*/
void push_front(Node<DATA_TYPE>*);
/**
* \brief 头删
*/
DATA_TYPE pop_front();
/**
* \brief 尾删
*/
DATA_TYPE pop_back();
/**
* \brief 删除当前结点后一个结点
*/
DATA_TYPE remove(Node<DATA_TYPE>* node);
/**
* \brief 删除第一个值为e的结点
*/
void remove(DATA_TYPE e);
/**
* \brief 逆置
*/
void reverse();
/**
* \brief 查找
*/
Node<DATA_TYPE>* find(DATA_TYPE e);
/**
* \brief 转成string
*/
std::string to_string(const DATA_TYPE& t);
/**
* \brief 转成string
*/
std::string toString();
private:
Node<DATA_TYPE>* first; //头结点
};
template<typename DATA_TYPE>
LinkedList<DATA_TYPE>::LinkedList()
{
Node<DATA_TYPE>* p = new Node<DATA_TYPE>();
if(p)
{
p->data = -1;
p->next = nullptr;
first = p;
}
}
template<typename DATA_TYPE>
LinkedList<DATA_TYPE>::~LinkedList()
{
while(first)
{
Node<DATA_TYPE>* p = first;
first = first->next;
delete(p);
p = nullptr;
}
}
template<typename DATA_TYPE>
void LinkedList<DATA_TYPE>::destory()
{
Node<DATA_TYPE> *s = first->next;
while(s)
{
Node<DATA_TYPE>* p = s;
s = s->next;
delete(p);
p = nullptr;
}
first->next = nullptr;
}
template<typename DATA_TYPE>
void LinkedList<DATA_TYPE>::push_back(DATA_TYPE e)
{
Node<DATA_TYPE>* cur = first;
while(cur->next)
{
cur = cur->next;
}
Node<DATA_TYPE>* p = new Node<DATA_TYPE>();
if(p)
{
p->data = e;
cur->next = p;
}
}
template<typename DATA_TYPE>
void LinkedList<DATA_TYPE>::push_front(Node<DATA_TYPE>* s)
{
if(s)
{
s->next = first->next;
first->next = s;
}
}
template<typename DATA_TYPE>
void LinkedList<DATA_TYPE>::push_front(DATA_TYPE e)
{
Node<DATA_TYPE>* p = new Node<DATA_TYPE>();
if(p)
{
p->data = e;
p->next = first->next;
first->next = p;
}
}
template<typename DATA_TYPE>
DATA_TYPE LinkedList<DATA_TYPE>::pop_front()
{
Node<DATA_TYPE> * p = first->next;
if(p)
{
DATA_TYPE e = p->data;
first->next = p->next;
delete(p);
p = nullptr;
return e;
}
return -1;
}
template<typename DATA_TYPE>
DATA_TYPE LinkedList<DATA_TYPE>::pop_back()
{
Node<DATA_TYPE>* p = first;
Node<DATA_TYPE>* s = p;
while(p->next)
{
s = p;
p = p->next;
}
DATA_TYPE e = p->data;
s->next = nullptr;
delete(p);
p = nullptr;
return e;
}
template<typename DATA_TYPE>
DATA_TYPE LinkedList<DATA_TYPE>::remove(Node<DATA_TYPE>* node)
{
if(node->next)
{
Node<DATA_TYPE> *p = node->next;
DATA_TYPE e = p->data;
node->next = p->next;
delete(p);
p = nullptr;
return e;
}
return -1;
}
template<typename DATA_TYPE>
void LinkedList<DATA_TYPE>::remove(DATA_TYPE e)
{
Node<DATA_TYPE>* p = first;
while(p->next)
{
if(p->next->data == e)
{
Node<DATA_TYPE> *s = p->next;
p->next = s->next;
delete(s);
s = nullptr;
}
else
{
p = p->next;
}
}
}
template<typename DATA_TYPE>
void LinkedList<DATA_TYPE>::reverse()
{
Node<DATA_TYPE>* p = first->next;
Node<DATA_TYPE>* n = p->next;
while(n)
{
p->next = n->next;
push_front(n);
n = p->next;
}
}
template<typename DATA_TYPE>
Node<DATA_TYPE>* LinkedList<DATA_TYPE>::find(DATA_TYPE e)
{
Node<DATA_TYPE> *p = first->next;
while(p)
{
if( p->data != e)
{
p = p->next;
}
else {
return p;
}
}
return nullptr;
}
template <typename DATA_TYPE>
std::string LinkedList<DATA_TYPE>::to_string(const DATA_TYPE& t)
{
static std::ostringstream oss;
oss.str("");
oss << t;
return oss.str();
}
template<typename DATA_TYPE>
std::string LinkedList<DATA_TYPE>::toString()
{
std::string str = "";
Node<DATA_TYPE> *p = first->next;
while(p)
{
std::cout << p <<" "<< to_string(p->data) <<std::endl;
str.append(to_string(p->data));
p = p->next;
}
return str;
}
#include "../include/LinkedList.hpp"
using namespace std;
int main()
{
LinkedList<char>* list = new LinkedList<char>();
cout << "=====头插=====" << endl;
list->push_front('A');
list->push_front('B');
list->push_front('C');
list->push_front('D');
list->push_front('E');
list->push_front('F');
list->toString();
cout <<endl;
cout << "=====销毁=====" << endl;
list->destory();
list->toString();
cout <<endl;
cout << "=====尾插=====" << endl;
list->push_back('A');
list->push_back('B');
list->push_back('C');
list->push_back('D');
list->push_back('E');
list->push_back('F');
list->toString();
cout <<endl;
cout << "=====翻转=====" << endl;
list->reverse();
list->toString();
cout <<endl;
cout << "=====删除值为'C'的当前结点=====" << endl;
list->remove('C');
list->toString();
cout <<endl;
cout << "=====删除当前结点为'D'的下一个结点=====" << endl;
list->remove(list->find('D'));
list->toString();
cout <<endl;
cout << "=====删除尾结点=====" << endl;
list->pop_back();
list->toString();
cout <<endl;
cout << "=====删除首结点=====" << endl;
list->pop_front();
list->toString();
cout <<endl;
return 0;
}
结果:
=====头插=====
0x19970f0 F
0x19970d0 E
0x19970b0 D
0x1997090 C
0x1997070 B
0x1997050 A
=====销毁=====
=====尾插=====
0x1997050 A
0x1997070 B
0x1997090 C
0x19970b0 D
0x19970d0 E
0x19970f0 F
=====翻转=====
0x19970f0 F
0x19970d0 E
0x19970b0 D
0x1997090 C
0x1997070 B
0x1997050 A
=====删除值为'C'的当前结点=====
0x19970f0 F
0x19970d0 E
0x19970b0 D
0x1997070 B
0x1997050 A
=====删除当前结点为'D'的下一个结点=====
0x19970f0 F
0x19970d0 E
0x19970b0 D
0x1997050 A
=====删除尾结点=====
0x19970f0 F
0x19970d0 E
0x19970b0 D
=====删除首结点=====
0x19970d0 E
0x19970b0 D