知识点与难度
链表、中等难度
描述
输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
链表的值不能重复。
构造过程,例如输入一行数据为:
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 ,节点中的值满足 0≤val≤10000
测试用例保证输入合法
输入描述:
输入一行,有以下4个部分:
1 输入链表结点个数
2 输入头结点的值
3 按照格式插入各个结点
4 输入要删除的结点的值
输出描述:
输出一行
输出删除结点后的序列,每个数后都要加空格
输入输出示例:
输入:
5 2 3 2 4 3 5 2 1 4 3
输出:
2 5 4 1
我的代码:
#include <iostream>
using namespace std;
struct Node{
int val;
Node* next;
};
int main() {
int n;
int val;
int pre;
cin >> n;
Node* head = nullptr;
Node* newp = nullptr;
Node* prep = nullptr;
cin>>val;
Node* p = new Node();
p->val = val;
p->next = nullptr;
head = p;
for(int i=0;i<n-1;i++) { // 注意 while 处理多个 case
cin >> val >> pre;
p = head;
while(p!=nullptr && p->val != pre){
p = p->next;
}
if(p!=nullptr){
newp = new Node();
newp->val = val;
newp->next = p->next;
p->next = newp;
}
}
cin >> pre;
p = head;
while(p!=nullptr && p->val!=pre){
prep = p;
p = p->next;
}
if(p!=nullptr){
if(p == head){
head = p->next;
free(p);
}
else{
prep->next = p->next;
free(p);
}
}
p = head;
while(p != nullptr){
cout<<p->val<<" ";
p = p->next;
}
}
// 64 位输出请用 printf("%lld")
我的代码分析:
没啥思路,链表的基本操作
top1代码:
#include<iostream>
using namespace std;
struct node{
int data;
struct node* next;
};
int main(){
int num,val;
int aft,pre;
cin>>num>>val;
//创建头结点
node* head = new node();
head->data = val;
head->next=NULL;
num--;
//一些列插入
while(num--){
cin>>aft>>pre;
//待插入结点
node* newNode = new node();
newNode->data = aft;
newNode->next = NULL;
//查找前一个结点
node *p=head;
while(p){
if(p->data==pre){
break;
}
else{
p = p->next;
}
}
//如果找到则继续插入
if(p){
node* tmp = p->next;
p->next = newNode;
newNode->next = tmp;
}
}
//读入最后一个参数,并删除
int del;
cin>>del;
node* p = head;
if(head){
node* q = head->next;
while(q){
if(q->data==del){
break;
}else{
p = p->next;
q = q->next;
}
}
if(q){
node* tmp = q->next;
p->next = tmp;
delete q;
}
}
p = head;
while(p){
cout<<p->data<<' ';
p = p->next;
}
return 0;
}
top1代码分析:
我觉得他这个应该删不了头节点吧。。。这道题的测试集居然没有删头节点的例子!
总结:
无