链表
链表是一种线性表,是数据结构中的一种。在内存中是一种非连续性的存储结构,数据元素的逻辑是依靠指针来实现链接。所以,链表不支持随机访问,和另一种数据结构数组时不同的。但是比数组好的一点是她在插入删除中会非常高效。数组在这方面不如链表理想。
链表包括数据域和指针
初始化头结点
在C++的构造函数里面对头指针进行初始化:
Link::Link()
{
head = new Node;
head->_val = -1;
head->_next = NULL;
}
插入节点
需要先new一个新节点cur出来,然后将cur的next指针指向head->next的地址,最后再将head->next指向cur。
删除节点
先遍历到指定节点的前一个节点,然后将next指针指向被删除的节点的next。然后delete那个悬空节点。
修改节点的值
先遍历找到节点,然后将data修改就可以了。
查找节点
通过遍历节点找到相应的节点。
链表反转
需要创建三个指针,分别指向第一个第二个第三个节点,将第一个结点的指针指向NULL,然后把第二个结点指向第一个结点,用第三个节点进行遍历,依次修改节点的next指针。
完整代码:
#include <iostream>
using namespace std;
class Node
{
public:
int _val;
Node* _next;
};
class Link
{
private:
Node* head;
public:
Link(); //构造函数
~Link(); //析构函数
int CreateLink(int n); // 创建链表
int getLength(); //获取链表长度
bool isEmpty(); //判断是否为空表
void insert(const int& data); // 尾部插入元素
void insertAthead(const int& data); // 头部插入元素
void insert_pos(const int& pos, const int& data); // 按位置插入元素
void erase(const int& data); //删除指定数据
void eraseAthead(); //删除头结点
void eraseAtEnd(); //删除尾结点
int update(const int& n, const int& data); //修改指定位置的数据
void reverse(); //反转链表
void print(); //打印链表
int find_pos(const int& data); //查找数据下标
int find(const int& n); //查找第n个元素是什么
void destory(); //销毁链表
};
Link::Link()
{
head = new Node;
head->_val = -1;
head->_next = NULL;
}
Link::~Link()
{
cout << "下次再见!" << endl;
}
// 创建链表
int Link::CreateLink(int n) {
if (n < 0) return -1;
Node* ptr, * tmp;
ptr = head;
for (int i = 0; i < n; ++i) {
cout << "请输入链表第" << i + 1 << "的值" << endl;
tmp = new Node;
cin >> tmp->_val;
ptr->_next = tmp;
tmp->_next = NULL;
ptr = tmp;
}
return 0;
}
//销毁链表
void Link::destory() {
if (head == NULL || head->_next == NULL) {
cout << "链表为空!" << endl;
return;
}
else {
// 从头结点的下一个开始销毁
Node* ptr = head->_next;
while (ptr->_next != NULL) {
Node