zoukankan      html  css  js  c++  java
  • 链表及其简单应用

    ##什么是链表 链表其实和数组一样,可以存储一串元素.但又与数组不同,那就是数组是以下标进行存储的,例如a[1],a[2],a[3]等,而链表则是根据许多数字的前后关系的数字进行存储的,其原理类似于图论中的[邻接表](https://blog.csdn.net/ronaldo7_zyb/article/details/78886844),所存储的序列并不是有序的,而是存储这个数的前面(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;
    } 
     
    
  • 相关阅读:
    Linux 改变文件的所有者
    Opencv -lippicv
    数据结构--二叉搜索树
    Window下cmd查看目录结构
    windows cmake与nmake
    Ubuntu18.04安装caffe python3.6 opencv3.2 CPU
    apt-get install 下载速度慢问题的解决
    使用pip安装速度慢问题的解决
    神经网络可视化
    【VS】代码行无法折叠及ctrl+鼠标左键无法跳转到定义的问题
  • 原文地址:https://www.cnblogs.com/pigzhouyb/p/10119847.html
Copyright © 2011-2022 走看看