📜  数据结构和算法|套装36

📅  最后修改于: 2021-06-29 00:52:47             🧑  作者: Mango

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开始,并且在有多个可能路径的情况下,以字母顺序行进。
1个
(一)efihgcdba
(B)阿贝德菲
(C)abcdegifh
(D)efihdgcba

解决方案:
重要的是要注意,答案不是图表的DFS。粉红色的节点给出了DFS的顺序。那就是:abdcegfh我。绿色的节点给出了它们“越过”的顺序:efihgcdb a。
1个
2个
选项(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)是正确的。