下面函数用“哑结点”统一处理删除单向链表中的头结点与中间结点。横线处应填( )。 struct Node{ int val; Node* next; Node(int v):val(v),next(nullptr){} }; Node* eraseAll(Node* head, int x){ Node dummy(0); dummy.next = head; Node* cur = &dummy; while(cur->next){ if(cur->next->val == x){ Node* del = cur->next; cur->next = del->next; // 空白处:让当前节点跳过待删除节点,直接指向后一个节点 delete del; }else cur = cur->next; } return dummy.next;
A:cur = cur->next;
B:cur->next = del->next;
C:del->next = cur->next;
D:cur->next = nullptr;
正确答案:B
答案解析
创建哑结点并将其后继指向头结点,用指针遍历链表。循环中判断当前节点的后继值是否等于目标值。若相等,则记录待删节点,将当前节点的后继更新为待删节点的后继,释放待删节点内存。若不相等,将当前节点指针推进到下一节点。遍历结束后返回哑结点的后继作为新的头结点。
试卷来源:202603 CCF-GESP编程能力等级认证C++五级真题