链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
请你实现一个链表。
操作:
insert x y:将yyy加入链表,插入在第一个值为xxx的结点之前。若链表中不存在值为xxx的结点,则插入在链表末尾。保证xxx,yyy为int型整数。
delete x:删除链表中第一个值为xxx的结点。若不存在值为xxx的结点,则不删除。
输入描述:
第一行输入一个整数nnn (1≤n≤1041\le n \le 10^41≤n≤104),表示操作次数。 接下来的nnn行,每行一个字符串,表示一个操作。保证操作是题目描述中的一种。
输出描述:
输出一行,将链表中所有结点的值按顺序输出。若链表为空,输出"NULL"(不含引号)。
输入:
5
insert 0 1
insert 0 3
insert 1 2
insert 3 4
delete 4
输出:
2 1 3
答案:
#include <iostream>
using namespace std;
struct List
{
int data;
List* next;
};
void insert(List* p, int x, int y)
{
List* q = p;
p = p->next;
while(p != NULL)
{
if(p->data == x)
{
break;
}
q = p;
p = p->next;
}
List* t = new List();
t->data = y;
q->next = t;
t->next = p;
}//链表插入操作
void del(List* p, int x)
{
List* q = p;
p = p->next;
while(p != NULL)
{
if(p->data == x)
{
q->next = p->next;
p->next = NULL;
delete p;
return;
}
q = p;
p = p->next;
}
}//链表删除节点
int main()
{
int n;
cin >> n;
List* head = new List();
head->next = NULL;
for(int i=0;i<n;i++)
{
string op;
cin >> op;
if(op == "insert")
{
int x,y;
cin >> x >> y;
insert(head, x, y);
}
if(op == "delete")
{
int x;
cin >> x;
del(head, x);
}
}
List* f = head->next;
if(f == NULL)
{
cout << "NULL";
}//判断链表是否为空,因为此时f指向第一节点若为空啧整个链表为空
while(f != NULL)
{
cout << f->data<<" ";
f = f->next;
}
return 0;
}
在这里运用到的是单链表的简单应用,对于本题足够使用,本题还可用数组写法如list<int>等
本题代码有ai改进后的代码感兴趣的可以进行了解(注:ai结果不一定有个人写的直白有时ai也会出错,仅作参考使用)
#include <iostream>
#include <string>
using namespace std;
struct ListNode {
int data;
ListNode* next;
ListNode() : data(0), next(nullptr) {} // 初始化data和next
};
void insert(ListNode*& head, int x, int y) {
ListNode* p = head;
ListNode* q = nullptr;
while (p != nullptr && p->data < x) { // 假设链表已排序
q = p;
p = p->next;
}
ListNode* t = new ListNode();
t->data = y;
if (q == nullptr) { // 插入到头部
t->next = head;
head = t;
} else {
t->next = p;
q->next = t;
}
}
void del(ListNode*& head, int x) {
ListNode* p = head;
ListNode* q = nullptr;
while (p != nullptr && p->data != x) {
q = p;
p = p->next;
}
if (p != nullptr) {
if (q == nullptr) { // 删除头节点
head = p->next;
} else {
q->next = p->next;
}
delete p;
}
}
int main() {
int n;
cin >> n;
ListNode* head = new ListNode(); // 哨兵节点
for (int i = 0; i < n; i++) {
string op;
cin >> op;
if (op == "insert") {
int x, y;
cin >> x >> y;
insert(head, x, y);
}
if (op == "delete") {
int x;
cin >> x;
del(head, x);
}
}
ListNode* f = head->next; // 跳过哨兵节点
if (f == nullptr) {
cout << "NULL";
} else {
while (f != nullptr) {
cout << f->data << " ";
f = f->next;
}
}
delete head; // 清理哨兵节点
return 0;
}