GESP 五级 · GESP 202506 C++ 五级 第 4 题

选择题 · 答案 A · 考点:链表

← 整套速查表 GESP 五级 全部真题

题目

下列 C++ 代码用循环链表解决约瑟夫问题,即假设 $n$ 个人围成一圈,从第一个人开始数,每次数到第 $k$ 个的人就出圈,输出最后留下的那个人的编号。横线上应填写( )。

struct Node {
    int data;
    Node* next;
};

Node* createCircularList(int n) {
    Node* head = new Node{1, nullptr};
    Node* prev = head;
    for (int i = 2; i <= n; ++i) {
        Node* node = new Node{i, nullptr};
        prev->next = node;
        prev = node;
    }
    prev->next = head;
    return head;
}

int findLastSurvival(int n, int k) {
    Node* head = createCircularList(n);
    Node* p = head;
    Node* prev = nullptr;

    while (p->next != p) {
        for (int count = 1; count < k; ++count) {
            prev = p;
            p = p->next;
        }
        // 横线处
    }

    cout << "最后留下的人编号是:" << p->data << endl;
    delete p;
    return 0;
}

A.

prev->next = p->next;
delete p;
p = prev->next;

B.

delete p;
prev->next = p->next;
p = prev->next;

C.

delete p;
p = prev->next;
prev->next = p->next;

D.

prev->next = p->next;
p = prev->next;
delete p;
答案:A

考点

链表 讲解 →链表 真题汇总 →

解题思维

根据上下文和C++语法规则确定空缺处应填的内容,关注函数调用参数、表达式和返回值类型。

常见错误

填空时注意语法完整性:分号、括号匹配、函数参数类型和个数、返回值类型。

详细解析(节选)

【考点】链表节点删除|循环链表指针操作|内存释放顺序

🎯 考纲定位

GESP 五级 C++ 大纲"数据结构与算法"模块核心考点。命题人专门卡住绝大多数考生的链表指针更新顺序弱点——链表操作里删除节点最容易掉链子,这道题就是把"前驱指针更新→释放节点→后移指针"这三个动作拆开打乱,只选对顺序才算真懂。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断