自己实现的单链表类,函数接口类似于STL的list,实现了头插法和尾插法,我觉得链表核心就是指针的使用,指针理解透了,实现起来就很简单。
#include <iostream>
//单链表节点
template<class T>
class node1 {
public:
T m_data; //数据域
node1 *m_nextNode; //指针域
};
//单链表类
template<class valueType>
class singleList
{
public:
//构造函数初始化单链表头节点
singleList()
{
m_head = new node1<valueType>();
m_head->m_nextNode = nullptr;
}
//析构函数中释放链表内所有元素空间
~singleList() {
node1<valueType> *nextNode = nullptr;
while (m_head->m_nextNode!=nullptr)
{
nextNode = m_head->m_nextNode; //保存下一节点地址
delete m_head; //释放当前节点空间
m_head = nextNode; //将m_head指向下一节点
}
delete m_head;
m_head = nullptr;
}
//从单链表的头部插入(头插法)
void push_front(valueType value)
{
node1<valueType> * node = new node1<valueType>();
node->m_data = value;
node->m_nextNode = m_head->m_nextNode;;
m_head->m_nextNode = node;
}
//从单链表的尾部插入(尾插法)
void push_back(valueType value)
{
node1<valueType> * endNode = m_head;//指向尾部节点的指针
//找到尾部节点
while (endNode->m_nextNode!=nullptr)
{
endNode = endNode->m_nextNode;
}
node1<valueType> * node = new node1<valueType>();
node->m_data = value;
node->m_nextNode = nullptr;
//尾部节点的指针域指向新增节点
endNode->m_nextNode = node;
}
/**************************************************
* @brief: 用<<运算符插入元素
* @param: value:要插入的元素值
**************************************************/
singleList<valueType>& operator<<(const valueType&value)
{
this->push_back(value);
return *this;
}
/**************************************************
* @brief: 从单链表中指定位置开始查找,查找第一个出现的指定元素,
* @param: value:要查找的元素
* @param: pos:从pos位置开始查找
* @return: 返回查找到的元素所在链表中的位置,从pos后的位置,如果没找到返回-1
**************************************************/
int findFirst(valueType value , int pos)
{
if(pos<0) return -1;
node1<valueType> *posNode = m_head; //指向pos所在位置的指针
for (int i=0 ;i<pos;i++)
{
posNode = posNode->m_nextNode;
}
int value_pos = 0;
while (posNode->m_nextNode != nullptr )
{
if (posNode->m_data == value)
{
return value_pos;
}
posNode = posNode->m_nextNode;
value_pos++;
}
return -1;
}
/**************************************************
* @brief: 从单链表中删除元素,删除第一个出现的指定元素
* @param: value:要删除的元素值
**************************************************/
void deleteFirst(valueType value)
{
node1<valueType> *node = m_head->m_nextNode; //指向删除元素所在位置的指针
node1<valueType> *nextNode = m_head; //要删除元素所在位置的上一指针
while (node!= nullptr)
{
if (node->m_data==value)
{
nextNode->m_nextNode = node->m_nextNode;
delete node;
return;
}
nextNode = nextNode->m_nextNode;
node = node->m_nextNode;
}
}
void printfAll()
{
node1<valueType> *node = m_head;
while (node!=nullptr)
{
std::cout << node->m_data << " ";
node = node->m_nextNode;
}
std::cout << std::endl;
}
private:
node1<valueType> *m_head;
};
int main()
{
singleList<int> list;
list << 2 << 2 << 45 << 6; //
int a = 10;
list << a;
list.printfAll();
list.push_back(20);
list.push_front(16);
list.printfAll();
std::cout<<"2 first pos is :"<<list.findFirst(2,0)<<std::endl;
list.deleteFirst(2);
std::cout << "already delete 2! " << std::endl;
list.printfAll();
list.deleteFirst(2);
std::cout << "already delete 2! " << std::endl;
list.printfAll();
list.deleteFirst(45);
std::cout << "already delete 45! " << std::endl;
list.printfAll();
return 0;
}