请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。
输入格式:
输入第1行为1个正整数n,表示当前单链表长度;第2行为n个空格间隔的整数,为该链表n个元素的数据域值。第3行为1个正整数m,表示对该链表施加的操作数量;接下来m行,每行表示一个操作,为2个或3个整数,格式为0 k d或1 k。0 k d表示在链表第k个结点后插入一个数据域值为d的结点,若k=0则表示表头插入。1 k表示删除链表中第k个结点,此时k不能为0。注:操作序列中若含有不合法的操作(如在长度为5的链表中删除第8个结点、删除第0个结点等),则忽略该操作。n和m不超过100000。
输出格式:
输出为一行整数,表示实施上述m个操作后的链表,每个整数后一个空格。输入数据保证结果链表不空。
输入样例:
5
1 2 3 4 5
5
0 2 8
0 9 6
0 0 7
1 0
1 6
输出样例:
7 1 2 8 3 5
代码长度限制
16 KB
Python (python3)
时间限制
1000 ms
内存限制
256 MB
Java (javac)
时间限制
5000 ms
内存限制
256 MB
其他编译器
时间限制
100 ms
内存限制
10 MB
#include <stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Node{
int data;
struct Node *next;
}LinkListNode;
LinkListNode* Createlist(int n)//创建链表
{
LinkListNode *head,*p,*q;
head = (LinkListNode*)malloc(sizeof(LinkListNode));
head->data = 1;
head->next = NULL;
p = head;
for(int i = 2;i <= n;i++)//从头结点开始依此赋值
{
q = (LinkListNode*)malloc(sizeof(LinkListNode));
q->data = i;
p->next = q;
p = q;
}
p->next = head;//最后指向头结点,构成循环
return head;
}
int main()
{
int n,p;
scanf("%d%d",&n,&p);
int ret[n];
int i = 0;
LinkListNode *head,*ptr,*q;
head = Createlist(n);
ptr = head;
while(i<n)
{
for(int j = 1;j < (p-1);j++)
{
ptr = ptr->next;
}
q = ptr->next;
ret[i] = q->data;
ptr->next = q->next;
free(q);
ptr = ptr->next;
i++;
}
for(int j = 0;j<n-1;j++)
{
printf("%d ",ret[j]);
}
printf("%d", ret[n - 1]);
return 0;
}
