GESP C++ 5级 2026.06
假设 head != nullptr ,下面是实现单向循环链表在头节点后插入新节点的代码,横线处应填入( )。
struct Node {
int val;
Node* next;
};
void insertAfterHead(Node* head, int x) {
Node* newNode = new Node;
newNode->val = x;
______________________ // 在此处填入代码
}
newNode->next = head; head->next = newNode;
newNode->next = head->next;
head->next = newNode;
head->next = newNode;
newNode->next = head->next;
newNode->next = head->next;
head = newNode;
下面代码遍历并输出一个循环单链表,其中 head 指向链表的第一个节点,横线处应填入的是( )。
struct Node {
int val;
Node* next;
};
void printList(Node* head) {
if (head == nullptr) return;
Node* p = head;
_______________________ // 在此处填入代码
cout << endl;
}
while (p != nullptr) {
cout val next;
}
while (p->next != nullptr) {
cout val next;
}
do {
cout val next;
} while (p != head);
for (; p; p = p->next) {
cout val << " ";
}
双链表结点定义如下,若要删除双链表中的中间结点(非首尾节点) p ,下面写法正确的是( )。
struct Node {
int val;
Node* prev;
Node* next;
};
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
p->next->prev = p->next;
p->prev->next = p->prev;
delete p;
p->prev = p->next;
p->next = p->prev;
delete p;
p->next->next = p->prev;
p->prev->prev = p->next;
delete p;
使用如下欧几里得算法求 gcd(105, 45) 时,函数 gcd(a, b) 的递归调用序列正确的是 ( )
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
gcd(105, 45) -> gcd(45, 60) -> gcd(60, 15) -> gcd(15, 0)
gcd(105, 45) -> gcd(45, 15) -> gcd(15, 0)
gcd(105, 45) -> gcd(60, 45) -> gcd(15, 45)
gcd(105, 45) -> gcd(15, 45) -> gcd(15, 0)
下面代码实现线性筛(欧拉筛),以筛选出 以内的所有素数。横线处的代码应为 ( )。
vector sieve(int n) {
vector is_prime(n + 1, true);
vector primes;
if (n >= 0) is_prime[0] = false;
if (n >= 1) is_prime[1] = false;
for (int i = 2; i <= n; ++i) {
if (is_prime[i]) {
primes.push_back(i);
}
for (int j = 0; j < primes.size() && i * primes[j] <= n; j++) {
is_prime[i * primes[j]] = false;
if (________________) break; // 在此处填入代码
}
}
return primes;
}
i % primes[j] == 0
primes[j] % i == 0
i % primes[j] != 0
i == primes[j]
下面关于埃氏筛法的说法正确的是( )。
每个合数只会被筛掉一次
从每个素数出发,把它的倍数标记为合数。
只能判断一个数是不是偶数
不能求出素数表
下面代码实现了计算 的快速幂算法,该算法体现的编程思想是( )
long long power(long long x, int n) {
if (n == 0) return 1;
long long res = power(x, n / 2);
if (n % 2 == 0) return res * res;
else return res * res * x;
}
枚举
贪心
分治
模拟
下面代码用于统计 中因子 出现了多少次。若 ,输出是( )
int n = 40;
int cnt = 0;
while (n % 2 == 0) {
cnt++;
n /= 2;
}
cout << cnt;
在一个有序数组中查找第一个大于或等于 的元素位置,横线处应填写( )。
int lowerBound(vector& a, int x) {
int l = 0, r = a.size();
while (l = x) ________________; // 在此处填入代码
else l = mid + 1;
}
return l;
}
r = mid + 1
r = mid - 1
r = mid
l = mid
有若干根木头,长度存于 wood 。每切一刀可以把一段木头分成两段。函数 check(wood, K, x) 返回:
用不超过 K 刀,能否使所有木段长度都不超过 x 。下面代码使用二分答案查找最小可行的 x ,横线处应填( )。
int binary_cut(vector& wood, int K) {
int l = 1;
int r = 0;
for (int len : wood) r = max(r, len);
while (l < r) {
int mid = l + (r - l) / 2;
if (check(wood, K, mid))
________________; // 在此处填入代码
else l = mid + 1;
}
return l;
}
r = mid + 1;
r = mid;
l = mid;
r = mid - 1;
