下面代码遍历并输出一个循环单链表,其中 head 指向链表的第一个节点,横线处应填入的是( )。
struct Node {
int val;
Node* next;
};
void printList(Node* head) {
if (head == nullptr) return;
Node* p = head;
_______________________ // 在此处填入代码
cout << endl;
}根据上下文和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% 的误选。