GESP 五级 · GESP 202512 C++ 五级 第 1 题

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

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

题目

对如下定义的循环单链表,横线处填写( )。

// 循环单链表的结点
struct Node {
    int data;      // 数据域
    Node* next;    // 指针域

    Node(int d) : data(d), next(nullptr) {}
};

// 创建一个只有一个结点的循环单链表
Node* createList(int value) {
    Node* head = new Node(value);
    head->next = head;
    return head;
}

// 在循环单链表尾部插入新结点
void insertTail(Node* head, int value) {
    Node* p = head;
    while (p->next != head) {
        p = p->next;
    }
    Node* node = new Node(value);
    node->next = head;
    p->next = node;
}

// 遍历并输出循环单链表
void printList(Node* head) {
    if (head == nullptr) return;

    Node* p = head;
    __________________  // 在此处填入代码
    cout << endl;
}

A.

while (p != nullptr){
    cout << p->data << " ";
    p = p->next;
}

B.

while (p->next != nullptr){
    cout << p->data << " ";
    p = p->next;
}

C.

do {
    cout << p->data << " ";
    p = p->next;
} while (p != head);

D.

for(; p; p=p->next){
    cout << p->data << " ";
}
答案:C

考点

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

解题思维

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

常见错误

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

详细解析(节选)

【考点】循环链表遍历|指针移动控制|do-while循环

1. 🎯 考纲定位 GESP 五级 数据结构章"链表"模块。命题人卡住的是线性链表思维惯性——学生背熟"while(p!=nullptr)"却忘了链表是环,指针永远回不到 nullptr 导致死循环。

2. 🧠 解题思维 看到循环单链表,先想"终止条件不能是 nullptr",关键观察是"回到头结点才停"。通法:遍历环状结构用"回到起点"做终止条件,遍历完整个环只需一圈。

3. 🪤 陷阱拆解 A/B/D 都是线性遍历写法,误以为能停;C 是唯一正确写法。最阴险的细节是p != nullptr vs p != head,背结论会掉坑——p 永远回不到 nullptr,但一定能回到 head(题目已保证非空链表)。

4. 🔄 反命题思维 命题人想考"循环链表遍历特征",如果把do-while改成while,答案就变错;提醒先看数据结构和终止条件,别被"遍历"二字带偏了。

同考点真题

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