【数据结构详解】链表

什么是链表

链表其实和数组一样,可以存储一串元素.但又与数组不同,那就是数组是以下标进行存储的,例如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<<"\n";

插入删除元素

同图解.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\n";
            return;
        }
    cout<<"no\n";
    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;
} 

猜你喜欢

转载自blog.csdn.net/Ronaldo7_ZYB/article/details/81119815