Que – 1.函数shiftNode()以两个链接列表(目标和源)作为输入。它从源中删除前端节点,并将其放置到目标前端。选择在给定函数替换X,Y,Z的语句集。
void shiftNode(struct node** destRoot,
struct node** srcRoot)
{
// the front of source node
struct node* newNode = *srcRoot;
assert(newNode != NULL);
X;
Y;
Z;
}
(一种)
X: *srcRoot = newNode->next
Y: newNode->next = *destRoot->next
Z: *destRoot->next = newNode
(B)
X: *srcRoot->next = newNode->next
Y: newNode->next = *destRoot
Z: *destRoot = newNode->next
(C)
X: *srcRoot = newNode->next
Y: newNode->next = *destRoot
Z: *destRoot = srcRoot->next
(D)
X: *srcRoot = newNode->next
Y: newNode->next = *destRoot
Z: *destRoot = newNode
解决方案:
X:将指针向前移动到源链接列表。
Y:将新节点指向旧目标链接列表的前面。
Z:让目标链接列表指向新节点。
因此,选项(D)是正确的。队列–2。当递归DFS(v)完成时,顶点v被称为“结束”。给定图的顶点在“上方”的顺序是什么?考虑DFS从顶点a开始,并且在有多个可能路径的情况下,以字母顺序行进。
(一)efihgcdba
(B)阿贝德菲
(C)abcdegifh
(D)efihdgcba
解决方案:
重要的是要注意,答案不是图表的DFS。粉红色的节点给出了DFS的顺序。那就是:abdcegfh我。绿色的节点给出了它们“越过”的顺序:efihgcdb a。
选项(A)是正确的。
Que – 3.您将获得两个单独链接的列表,其头分别为head_ref1和head_ref2。以下功能有什么函数?
int myFunc(Node* head_ref1, Node* head_ref2) {
Node *pointer1 = head_ref1, *pointer2 = head_ref2;
while (pointer1 != pointer2) {
pointer1 = pointer1?pointer1->next:head_ref2;
pointer2 = pointer2?pointer2->next:head_ref1;
}
return pointer1?pointer1->data:-1;
}
(A)合并两个链表
(B)找到两个链表的合并点
(C)交换两个链表的节点
(D)程序无限循环运行
解决方案:
指向两个链表的指针在列表之间不断递增和交换,直到找到公共的交点为止。如果没有合并点,即指针1和指针2在NULL处相遇,则函数返回-1。对样本链接列表执行试运行将使概念更清晰。
选项(B)是正确的。
队列– 4.函数copyBSTNodes()创建二进制搜索树的每个节点的副本,并将复制的节点插入为原始节点的左子节点。生成的树仍然是BST。选择在给定函数替换X和Y的语句集。
void copyBSTNodes (struct node* root) {
struct node* prevLeft;
if (root==NULL) return;
copyBSTNodes (root->left);
copyBSTNodes (root->right);
X;
root->left = newNode(root->data);
Y;
}
(一种)
X: prevLeft->left = root->left
Y: root->left->left = prevLeft->left
(B)
X: prevLeft = root->left
Y: root->left->left = prevLeft
(C)
X: prevLeft = root
Y: root->left = prevLeft
(d)
X: prevLeft = root->left
Y: root->left->left = prevLeft->left
解决方案:
选项(B)是正确的。
Que –5。函数deleteDup()将以升序排序的链表作为输入。它仅遍历一次即可从列表中删除重复的节点。选择在给定函数替换X,Y,Z的语句集。
void eraseDup(struct node* root) {
struct node* current = root;
if (X)
return;
while (current->next!=NULL) {
if (Y) {
struct node* nextOfNext = current->next->next;
free(current->next);
current->next = nextOfNext;
}
else {
Z
}
}
}
(一种)
X: current == NULL
Y: current = current->next
Z: current->data = current->next->data;
(B)
X: current == NULL
Y: current->data == current->next->data
Z: current = current->next;
(C)
X: current->next == NULL
Y: current->next->data == current->next->next->data
Z: current = current->next;
(D)
X: current->next == NULL
Y: current->data = current->next->data
Z: current = current->next;
解决方案:
由于输入链接列表已经排序,因此我们在比较相邻节点的同时向下移动列表。当相邻节点中的数据相同时,我们删除第二个节点。注意:在执行删除操作之前,需要存储下一个节点之后的节点。
选项(B)是正确的。