链表及其简单应用
Posted pigzhouyb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表及其简单应用相关的知识,希望对你有一定的参考价值。
什么是链表
链表其实和数组一样,可以存储一串元素.但又与数组不同,那就是数组是以下标进行存储的,例如a[1],a[2],a[3]等,而链表则是根据许多数字的前后关系的数字进行存储的,其原理类似于图论中的邻接表,所存储的序列并不是有序的,而是存储这个数的前面(next)和这个数的后面(pre)来得到这一串有序的序列的,尽管其存储方式相对零散但却十分方便.
链表与数组/链表的优点与缺点
删除与插入:
在添加与存储方面,链表要比数组更为方便,下列图中更能说明.
1.这是数组删除和插入的操作图解:
2.这是链表的删除与插入操作图解:
链表与数组的存储
有100000行数组,每行数据最多有100000,但最后只有800000的数据,怎么办呢?
1.数组:a[100000][100000].......??
2.链表:这个十分合适,我们可以用一个数组head存储每一行数据的头,跟剧每一个头去确定每一行数列的顺序,这样就可以吧空间压缩到了线性,那么就可以方便存储了.
查询
数组可以实现O(1)查询,但是链表却是需要通过遍历的,在这一方便时间复杂度并不是最优的
链表遍历元素
跟剧first[]数组(存储每一串数的开头位置)呢Link[](存储链表内买一个元素的信息)进行实现,next表示下一个节点的指针,data表示具体数值.
具体代码如下:
for (int i=first[k];i!=0;i=Link[i].next])
cout<<Link[i].data<<‘ ‘;
cout<<"
";
插入删除元素
同图解.1.插入:将前一个元素的next指向插入的节点,将前一个这个元素的next指向原来元素指向的next节点即可
2.删除:将前一个元素的next直接指向当前删除元素的next即可
具体例题详解:链表操作
给定m个操作,规定:
1.输入一个数据,在尾部插入
2.输入一个数据,查询链表中是否有这个数据
3.输入一个数据,在链表中删除最前面的这个数
4.输出链表
代码如下:
#include<bits/stdc++.h>
using namespace std;
struct Linknote
{
int data,next,pre;
}Link[10000];
int first=0,last=0,cnt=0;
void Push(int num)
{
Link[last].next=++cnt;
Link[cnt].data=num;
Link[cnt].pre=last;
Link[cnt].next=0;
last=cnt;
if (!Link[cnt].pre) first=cnt;
return;
}
void Ask(int num)
{
for (int i=first;i!=0;i=Link[i].next)
if (num==Link[i].data)
{
cout<<"yes
";
return;
}
cout<<"no
";
return;
}
void Pop(int num)
{
for (int i=first;i!=0;i=Link[i].next)
if (Link[i].data==num)
{
if (i==first) first=Link[first].next,Link[first].pre=0;
else if (i==last) last=Link[last].pre,Link[last].next=0;
else
{
int P=Link[i].pre,N=Link[i].next;
Link[P].next=N;
Link[N].pre=P;
}
if (!first) last=0;
return;
}
return;
}
void Write()
{
for (int i=first;i!=0;i=Link[i].next)
cout<<Link[i].data<<‘ ‘;
cout<<endl;
return;
}
int main()
{
ios::sync_with_stdio(false);
int m;cin>>m;
for (int i=1;i<=m;i++)
{
int k,x;cin>>k;
if (k!=4) cin>>x;
if (k==1) Push(x);
if (k==2) Ask(x);
if (k==3) Pop(x);
if (k==4) Write();
}
return 0;
}
以上是关于链表及其简单应用的主要内容,如果未能解决你的问题,请参考以下文章