题目
总时间限制: 1000ms 内存限制: 65536kB
描述
给定N个整数,将这些整数中与M相等的删除
假定给出的整数序列为:1,3,3,0,-3,5,6,8,3,10,22,-1,3,5,11,20,100,3,9,3
应该将其放在一个链表中,链表长度为20
要删除的数是3,删除以后,链表中只剩14个元素:1 0 -3 5 6 8 10 22 -1 5 11 20 100 9
要求:必须使用链表,不允许使用数组,也不允许不删除元素直接输出
程序中必须有链表的相关操作:建立链表,删除元素,输出删除后链表中元素,释放链表
不符合要求的程序即使通过,也会算作0分
输入
输入包含3行:
第一行是一个整数n(1 <= n <= 200000),代表数组中元素的个数。
第二行包含n个整数,代表数组中的n个元素。每个整数之间用空格分隔;每个整数的取值在32位有符号整数范围以内。
第三行是一个整数k,代表待删除元素的值(k的取值也在32位有符号整数范围内)。
输出
输出只有1行:
将数组内所有待删除元素删除以后,输出数组内的剩余元素的值,每个整数之间用空格分隔。
样例输入
20
1 3 3 0 -3 5 6 8 3 10 22 -1 3 5 11 20 100 3 9 3
3
样例输出
1 0 -3 5 6 8 10 22 -1 5 11 20 100 9
题意
输入n,接着输入n个整数构建一个链表;然后输入待删除的整数值k,遍历链表并删除所有节点值等于k的节点;完成删除后,输出链表中剩余的所有节点值。
思路
首先创建链表,依次将输入的整数存入新节点并链接起来;然后遍历链表,定位并删除所有值与目标值相等的节点,删除完成后,再次遍历链表,输出剩余节点的值。
代码
#include<bits/stdc++.h>
using namespace std;
int n,k;
定义链表
struct p{int x; // 节点存储的数据p *next; // 指向下一个节点的指针p(){next=NULL; // 初始化next}
};int main(){cin>>n;//创建链表p* h=new p;//创建头节点cin>>h->x;//读取头节点的值p* tmp;//临时指针tmp=h;//指向链表的最后一个节点for(int i=1;i<n;i++){p *t=new p(); //创建新节点cin>>t->x; //读取新节点的值tmp->next=t; //将新节点连接到链表后面tmp=t; //让tmp指向新的末尾节点}tmp->next=h; //将最后一个节点指向头节点,形成循环链表cin>>k;//删除值为k的节点for(int i=0;i<n;i++){if(tmp->next->x==k){//如果下一个节点的值等于k,删除该节点tmp->next=tmp->next->next;}else{//否则移动到下一个节点tmp=tmp->next;}}tmp->next=NULL;tmp=h;if(tmp->x==k){tmp=h->next;//如果头节点要删除,就指向第二个节点}while(tmp!=NULL){//如果tmp不是空的就输出cout<<tmp->x<<' ';tmp=tmp->next;}return 0;
}