GESP 五级 · GESP 202606 C++ 五级 第 2 题

选择题 · 答案 C · 考点:链表、循环结构

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

题目

下面代码遍历并输出一个循环单链表,其中 head 指向链表的第一个节点,横线处应填入的是( )。

struct Node {
    int val;
    Node* next;
};
void printList(Node* head) {
    if (head == nullptr) return;
    Node* p = head;
    _______________________ // 在此处填入代码
    cout << endl;
}
答案:C

考点

链表 讲解 →链表 真题汇总 →循环结构

解题思维

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

常见错误

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

详细解析(节选)

【考点】循环链表遍历|do-while 循环结构|指针边界判断

GESP 五级明确考察循环链表遍历。命题人故意用"线性链表遍历结论"误导考生——绝大多数人会机械套用"while(p!=nullptr)",却忘在环状结构中指针永不置空,导致死循环。

解题链:①识别链表为环形 → ②遍历需恰输出每个节点 → ③终止条件必须是回到起点 → ④do-while 适合"先执行再判断"的场景。核心观察:p 初始等于 head,若用 while(p!=head) 会漏掉首节点;只有 do 块确保至少执行一次,while(p!=head) 确保环游一圈后停止。

A 项陷阱:套用线性链表 while(p!=nullptr),环首尾相接使 p 永不为空,死循环。B 项陷阱:while(p->next!=nullptr) 误判"下一个节点存在",环中 p->next 始终指向 head,同样不终止。D 项陷阱:for 循环条件同 A,且缺少 cout 语句(若题目仅要求计数则 D 可改,但此处要求打印)。C 项唯一正确:do 块保证打印 head 后 p 前进,while(p!=head) 确保回到起点才停,完美契合环状结构。

命题视角:若将链表改为线性,答案即 A 或 D;若改为双向环,终止条件变为 p->prev==head;若改为计数,do-while 结构不变仅改 body。刷到链表遍历题,先问"这是环还是线?""起点在哪?""终止条件是什么?",三个问题能避免 90% 的误选。

同考点真题

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