<font size=4> ##什麼是鏈表 鏈表其實和數組同樣,能夠存儲一串元素.但又與數組不一樣,那就是數組是如下標進行存儲的,例如a[1],a[2],a[3]等,而鏈表則是根據許多數字的先後關係的數字進行存儲的,其原理相似於圖論中的[鄰接表](https://blog.csdn.net/ronaldo7_zyb/article/details/78886844),所存儲的序列並非有序的,而是存儲這個數的前面(next)和這個數的後面(pre)來獲得這一串有序的序列的,儘管其存儲方式相對零散但卻十分方便.ios
##鏈表與數組/鏈表的優勢與缺點c++
在添加與存儲方面,鏈表要比數組更爲方便,下列圖中更能說明. 1.這是數組刪除和插入的操做圖解: 2.這是鏈表的刪除與插入操做圖解: ###鏈表與數組的存儲 有100000行數組,每行數據最多有100000,但最後只有800000的數據,怎麼辦呢? 1.數組:a[100000][100000].......?? 2.鏈表:這個十分合適,咱們能夠用一個數組head存儲每一行數據的頭,跟劇每個頭去肯定每一行數列的順序,這樣就能夠吧空間壓縮到了線性,那麼就能夠方便存儲了. ###查詢 數組能夠實現O(1)查詢,可是鏈表倒是須要經過遍歷的,在這一方便時間複雜度並非最優的數組
##鏈表遍歷元素 跟劇first[]數組(存儲每一串數的開頭位置)呢Link[](存儲鏈表內買一個元素的信息)進行實現,next表示下一個節點的指針,data表示具體數值. 具體代碼以下:spa
for (int i=first[k];i!=0;i=Link[i].next]) cout<<Link[i].data<<' '; cout<<"\n";
##插入刪除元素 同圖解.1.插入:將前一個元素的next指向插入的節點,將前一個這個元素的next指向原來元素指向的next節點便可 2.刪除:將前一個元素的next直接指向當前刪除元素的next便可.net
##具體例題詳解:鏈表操做 給定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; }