描述
输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
链表的值不能重复。
构造过程,例如输入一行数据为:
6 2 1 2 3 2 5 1 4 5 7 2 2
则第一个参数6表示输入总共6个节点,第二个参数2表示头节点值为2,剩下的2个一组表示第2个节点值后面插入第1个节点值,为以下表示:
1 2 表示为
2->1
链表为2->1
3 2表示为
2->3
链表为2->3->1
5 1表示为
1->5
链表为2->3->1->5
4 5表示为
5->4
链表为2->3->1->5->4
7 2表示为
2->7
链表为2->7->3->1->5->4
最后的链表的顺序为 2 7 3 1 5 4
最后一个参数为2,表示要删掉节点为2的值
删除 结点 2
则结果为 7 3 1 5 4
数据范围:链表长度满足 1≤n≤1000 1≤n≤1000 ,节点中的值满足 0≤val≤10000 0≤val≤10000
测试用例保证输入合法
输入描述:
输入一行,有以下4个部分:
1 输入链表结点个数
2 输入头结点的值
3 按照格式插入各个结点
4 输入要删除的结点的值
输出描述:
输出一行
输出删除结点后的序列,每个数后都要加空格
示例1:
输入:5 2 3 2 4 3 5 2 1 4 3
输出:2 5 4 1
说明:形成的链表为2->5->3->4->1
删掉节点3,返回的就是2->5->4->1
示例2:
输入:6 2 1 2 3 2 5 1 4 5 7 2 2
输出:7 3 1 5 4
#include <iostream>
#include <iterator>
#include <math.h>
using namespace std;
struct node{
int data;
node *next;
};
//void deleteNode(node *head,int x);
int main() {
char c;
node *L;
int total;
int data0;
int datai;
int deleteN=0;
while(cin>>total){
if(total>=1&&total<=1000){
cin>>data0;
for(int i=0;i<total;i++){
cin>>L[i].data;
L=L->next;
}
cin>>deleteN;
for(int j=0;j<total;j++){
if(L[j].data == deleteN){
node* prev;
prev = L[j-1].next;
prev->next =L[j].next;
}else{
cout<<"error"<<endl;
}
}
}else cout<<"input error!"<<endl;
}
c = getchar();
return 0;
}
// 64 位输出请用 printf("%lld")
说明:上述代码并不是真正的答案,但是编译时出现这个问题。现在主要来分析这个问题。首先是数据数据的格式,查看是否出现,数据溢出和踩踏的问题,如数组越界。
#include <iostream>
#include <iterator>
#include <math.h>
using namespace std;
struct node {
int data;
node* next;
};
//void deleteNode(node *head,int x)
int main() {
char c;
node* L;
int nodesn;
int headData;
int taili, headi;
int deleteN = 0;
while (cin >> nodesn) { //1
if (nodesn >= 1 && nodesn <= 1000) {
cin >> headData;
if (headData >= 0 && headData <= 10000) {
L[0].data = headData;
//除头节点之外的插入
for (int i =1; i < nodesn; i++) {
cin >>taili>>headi ;
if(headi== L[i].data){
L[i+1].data =taili;
L->next= L->next->next;
}
}
cin >> deleteN;
for (int j = 0; j < nodesn; j++) {
if (L[j].data == deleteN) {
node* prev;
prev = L[j - 1].next;
prev->next = L[j].next;
}
}
//output
for (int l = 0; l < nodesn; l++)
cout << L[l].data << " ";
cout << endl;
}
else
cout << "input error!" << endl;
}
}
return 0;
}
// 64 位输出请用 printf("%lld")