鏈表及其簡單應用


##什么是鏈表 鏈表其實和數組一樣,可以存儲一串元素.但又與數組不同,那就是數組是以下標進行存儲的,例如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<<"\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;
} 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM