鏈表與數組/鏈表的優點與缺點
刪除與插入:
在添加與存儲方面,鏈表要比數組更為方便,下列圖中更能說明.
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;
}