0
点赞
收藏
分享

微信扫一扫

删除链表中满足区间值的结点

佃成成成成 2022-04-05 阅读 43
c++

利用单链表表示一个递增的整数序列,删除链表中值大于等于mink且小于等于maxk的所有元素(mink和maxk是给定的两个参数,其值可以和表中的元素相同,也可以不同)。

 

多组数据,每组数据有两行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔),第三行为给定的mink和maxk(用空格分隔)。当n=0时输入结束。

对于每组数据分别输出一行,依次输出删除元素后的链表元素,元素之间用空格分隔。

 

5
1 2 3 4 5
2 4
6
2 4 6 8 10 12
3 5
0
1 5
2 6 8 10 12
#include <iostream>
using namespace std;
const int N = 100000;
int head,idx,e[N],ne[N];
void init()
{
	head=-1;
	idx=0;
}
void add_to_head(int x)
{
	e[idx]=x;
	ne[idx]=head;
	head=idx++;
}
void insert(int x,int k)
{
	e[idx]=x;
	ne[idx]=ne[k];
	ne[k]=idx++;
}
void remove(int k)
{
	ne[k]=ne[ne[k]];
}
int main()
{
	
	int n;
	while(cin>>n,n!=0)
	{
		init(); 
		for(int i = 1;i <= n;i ++ )
		{
			int num;
			cin>>num;
			if(i==1)add_to_head(num);
			else insert(num,idx-1);
		}
		int l,r;
		cin>>l>>r;
		int st,ed;
		for(int i = head;i != -1;i = ne[i] )
		{
			if(e[i]>=l&&e[i]<=r)
			{
				st=i;
				break;
			}
		}
		for(int i = head;i != -1;i = ne[i] )
		{
			if((e[i]>=l&&e[i]<=r)&&(!(e[ne[i]]>=l&&e[ne[i]]<=r)))
			{
				ed=i;
				break;
			}
		}
		ne[st-1]=ne[ed];
		for(int i = head;i != -1;i = ne[i] )
		{
			cout<<e[i]<<" ";
		}
		cout<<endl;
	}
	return 0;
}

 

举报

相关推荐

0 条评论