对如下定义的循环单链表,横线处填写( )。
// 循环单链表的结点
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++语法规则确定空缺处应填的内容,关注函数调用参数、表达式和返回值类型。
填空时注意语法完整性:分号、括号匹配、函数参数类型和个数、返回值类型。
【考点】循环链表遍历|指针移动控制|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,答案就变错;提醒先看数据结构和终止条件,别被"遍历"二字带偏了。