1395 链表插入II
时间限制 : 2000/1000 MS(Java/Others) | 内存限制 :65536/32768 KB(Java/Others)
提交数 : 1189 | 通过数 : 581
题目描述
给定一串数字,然后给定若干插入操作,将操作后的结果输出。
输入要求
第一行:输入一个整数n,表示这串数字有n个(n>=1)。
第二行:输入这n个数字。
第三行:输入一个整数m,表示有m次插入操作。
后面m行:输入a b c1,c2,c3,c4...cb(b项),表示在这串数字当前第a个数字之后插入b个数字,这b个数字分别是c1,c2到cb。(假设链表第一个数字编号为1)
输出要求
输出操作后的结果。每个数字用空格空开
输入样例
3 2 1 3 2 1 5 3 3 3 3 3 2 6 4 4 4 4 4 4
输出样例
2 3 4 4 4 4 4 4 3 3 3 3 1 3
#include<bits/stdc++.h>
using namespace std;
typedef struct S{
int id;
struct S *next;
}stu;
stu* init()
{
stu*p=(stu*)malloc(sizeof(stu));
p->id=0;
p->next=NULL;
return p;
}
void endinsert(stu*head,int date)
{
stu*p=head;
while(p->next!=NULL)
{
p=p->next;
}
stu*q=(stu*)malloc(sizeof(stu));
q->id=date;
q->next=p->next;
p->next=q;
}
void insert(stu*head,int i,int j)
{
stu*p=head->next;
int flag=1;
while(p!=NULL)
{
if(flag==i)
{
stu*p2=(stu*)malloc(sizeof(stu));
p2->id=j;
p2->next=p->next;
p->next=p2;
}
else
{
p=p->next;
}
flag++;
}
}
void print(stu*head)
{
stu*p=head->next;
int flag=0;
while(p!=NULL)
{
flag++;
if(flag==1)
printf("%d",p->id);
else
printf(" %d",p->id);
p=p->next;
}
printf("\n");
}
int main()
{
int n;
cin>>n;
stu*head=init();
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
endinsert(head,x);
}
int x1;
cin>>x1;
for(int i=0;i<x1;i++)
{
int y,z;
cin>>y>>z;
vector<int> a;
for(int i=0;i<z;i++)
{
int w;
cin>>w;
a.push_back(w);
}
reverse(a.begin(),a.end());
for(int i=0;i<a.size();i++)
{
insert(head,y,a[i]);
}
}
print(head);
return 0;
}