⬅ 返回

1、静态链表

struct Snode{
	int previous;
	int value;
	int next;
};

初始化

a[0].next=1;
a[1].previous=0;

a[0].next指向第一个元素

a[1].previous指向最后一个元素

从a[0].next开始遍历到a[1]结束

例题

实现一个双链表,双链表初始为空,支持 5 种操作:

在最左侧插入一个数;
在最右侧插入一个数;
将第 k 个插入的数删除;
在第 k 个插入的数左侧插入一个数;
在第 k 个插入的数右侧插入一个数
现在要对该链表进行 M 次操作,进行完所有操作后,从左到右输出整个链表。

注意:题目中第k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这n 个数依次为:第1 个插入的数,第 2 个插入的数,…第 n 个插入的数。

代码

#include <iostream>
using namespace std;
const int N = 1e6+10;
struct Snode{
	int previous;
	int value;
	int next;
};
Snode a[N];
int dit=2;
 
int main(){
	int m;
	cin>>m;
	a[0].next=1;
  a[1].previous=0;
	for(int i=0;i<m;i++)
	{
		string str;
		cin>>str;
		if(str=="L")
		{
			int x;
			cin>>x;
			a[dit].value=x;
			a[dit].next=a[0].next;
			a[dit].previous=0;
			a[a[0].next].previous=dit; 
			a[0].next=dit;
			
			dit++;
			
		}else if(str=="R"){
			int x;
			cin>>x;
			a[dit].value=x;
			a[dit].previous=a[1].previous;
			a[dit].next=1;
			a[a[1].previous].next=dit;
			a[1].previous=dit;
			dit++;
			
		}else if(str=="D"){
			int k;
			cin>>k;
			k+=1;
			a[a[k].previous].next=a[k].next;
			a[a[k].next].previous=a[k].previous;
			
		}else if(str=="IL"){
			int k,x;
			cin>>k>>x;
			k+=1;
			a[dit].value=x;
			a[dit].next=k;
			a[dit].previous=a[k].previous;
			a[a[k].previous].next=dit;
			a[k].previous=dit;
			dit++;
			
		}else if(str=="IR"){
			int k,x;
			cin>>k>>x;
			k+=1;
			a[dit].value=x;
			a[dit].next=a[k].next;
			a[dit].previous=k;
			a[a[k].next].previous=dit;
			a[k].next=dit;
			dit++;	
		}
	}
	-----------------------------------------------------
	for(int i=a[0].next;i!=1;i=a[i].next)//从a[0].next即第一个元素开始遍历,到i=1时遍历结束
			cout<<a[i].value<<" ";
	
	
}