1.单链表
单链表是一种线性数据结构,由一系列节点组成,每个节点包含两个部分:数据域和指针域。数据域用于存储节点的数据,指针域用于指向下一个节点的地址。在单链表中,每个节点只有一个指针指向它的后继节点,而没有指向前驱节点的指针。单链表的头节点是第一个节点,尾节点是最后一个节点,尾节点的指针域指向一个特殊值NULL,表示链表的结束。
个人理解:
单链表需要两个类,第一个类(LinkList)用来创建头节点,头节点有且仅有一个,在头节点类中有这样一个其它类成员,简称节点类(Node),节点类中一般有多个数据和一个节点类对象成员,此对象不要在定义时初始化,不然就一直定义套娃了。且头节点类对象应该有一个数据用来记录当前链接到多少个节点,此处为N
还是用图来表示直接点
头节点类:
class LinkList
{
Node *head;
int N=0;
public:
LinkList()
{
//初始化头节点和数据
head = new Node("",NULL);
N = 0;
};
节点类:
class Node
{
public:
string item;
Node* next;
Node(string item,Node *next)
{
this->item = item;
this->next = next;
};
};
头节点本质上也是个节点,也有自己的数据对象,但一般用不上,随便初始化就行。
单节点:
链表图解:
通俗点说,头节点不是树枝分叉出多个枝条,而是树干不断增强自己,在生长的过程中有些部分生出枝条形成数据data。
链表雏形初步完善,接下来就是常规的增删操作。
结尾追加
void insert(string t)
{
Node *n = head; //从头节点开始
while (n->next != NULL) //如果有一个节点的下一个节点为NULL,那就是到末尾了
{
n = n->next;
}
Node *new_node = new Node(t, NULL); //现场创建一个节点,并为其链接,注意它的下一个节点一定要为NULL
n->next = new_node;
N++; //别忘了节点数加加
}
插入增加
void insert(int i, string t)
{
//先找到i的前一个节点
Node *pre = head;
for (int index = 0; index <= i-1; index++)//这里建议自己推理一下
{ //我的第一个节点的我默认为0索引处
pre = pre->next; //看自己怎么想,头节点为0索引也行
}
//找到i处的节点
Node *curr = pre->next;
//创建新节点,让其指向原i处节点,并让i-1处节点指向它
Node *new_node = new Node(t, curr);
new_node->next = curr;
pre->next = new_node; //i-1处指向
N++;
}
选择删除
string remove(int i)
{
//先找到i的前一个节点
Node *pre =head;
for (int index = 0; index <= i; index++)
{
pre = pre->next;
}
//再让i-1处节点指向i+1处节点,并断掉原i节点的指向
Node *curr = pre->next;
Node *next_node = curr->next;
pre->next = next_node;
N--;
return curr->item;
}
单链表可用来存储不确定的一组数据,它的长度大小不会像数组那样被规定。添加数据灵活,但是它没有规定意义上的索引值,查找数据始终要从头节点开始遍历查询,不像数组直接定位查找。并且多个指针的创建这使得链表需要更多内存存储。