📌  相关文章
📜  在给定约束下删除链表中给定节点的 C++ 程序

📅  最后修改于: 2022-05-13 01:55:11.260000             🧑  作者: Mango

在给定约束下删除链表中给定节点的 C++ 程序

给定一个单链表,编写一个函数来删除给定的节点。您的函数必须遵循以下约束:

  1. 它必须接受指向起始节点的指针作为第一个参数和要删除的节点作为第二个参数,即指向头节点的指针不是全局的。
  2. 它不应该返回指向头节点的指针。
  3. 它不应该接受指向头节点的指针。

您可以假设链接列表永远不会为空。
让函数名称为 deleteNode()。在一个简单的实现中,当要删除的节点是第一个节点时,该函数需要修改头指针。如上一篇文章所述,当一个函数修改头指针时,该函数必须使用给定的方法之一,我们不能在这里使用任何这些方法。
解决方案:
我们明确处理要删除的节点是第一个节点的情况,我们将下一个节点的数据复制到head并删除下一个节点。被删除的节点不是头节点的情况,可以通过查找前一个节点,改变前一个节点的下一个节点来正常处理。以下是实现。

C++
// C++ program to delete a given node
// in linked list under given constraints
#include 
using namespace std;
  
// Structure of a linked list 
// node 
class Node 
{ 
    public:
    int data; 
    Node *next; 
}; 
  
void deleteNode(Node *head, 
                Node *n) 
{ 
    // When node to be deleted is 
    // head node 
    if(head == n) 
    { 
        if(head->next == NULL) 
        { 
            cout << "There is only one node." <<
                    " The list can't be made empty "; 
            return; 
        } 
  
        // Copy the data of next node 
        // to head 
        head->data = head->next->data; 
  
        // Store address of next node 
        n = head->next; 
  
        // Remove the link of next node 
        head->next = head->next->next; 
  
        // Free memory 
        free(n); 
  
        return; 
    } 
  
    // When not first node, follow 
    // the normal deletion process 
  
    // Find the previous node 
    Node *prev = head; 
    while(prev->next != NULL && 
          prev->next != n) 
        prev = prev->next; 
  
    // Check if node really exists in 
    // Linked List 
    if(prev->next == NULL) 
    { 
        cout << 
        "Given node is not present in Linked List"; 
        return; 
    } 
  
    // Remove node from Linked List 
    prev->next = prev->next->next; 
  
    // Free memory 
    free(n); 
  
    return; 
} 
  
/* Utility function to insert a 
   node at the beginning */
void push(Node **head_ref, 
          int new_data) 
{ 
    Node *new_node = new Node();
    new_node->data = new_data; 
    new_node->next = *head_ref; 
    *head_ref = new_node; 
} 
  
/* Utility function to print a 
   linked list */
void printList(Node *head) 
{ 
    while(head != NULL) 
    { 
        cout << head->data << " "; 
        head = head->next; 
    } 
    cout << endl;
} 
  
// Driver code
int main() 
{ 
    Node *head = NULL; 
  
    /* Create following linked list 
       12->15->10->11->5->6->2->3 */
    push(&head,3); 
    push(&head,2); 
    push(&head,6); 
    push(&head,5); 
    push(&head,11); 
    push(&head,10); 
    push(&head,15); 
    push(&head,12); 
  
    cout << "Given Linked List: "; 
    printList(head); 
  
    /* Let us delete the node with 
       value 10 */
    cout << "Deleting node " << 
             head->next->next->data << " "; 
    deleteNode(head, head->next->next); 
  
    cout << "Modified Linked List: "; 
    printList(head); 
  
    // Let us delete the first node 
    cout << "Deleting first node "; 
    deleteNode(head, head); 
  
    cout << "Modified Linked List: "; 
    printList(head); 
    return 0; 
} 
// This code is contributed by rathbhupendra


输出:

Given Linked List: 12 15 10 11 5 6 2 3

Deleting node 10:
Modified Linked List: 12 15 11 5 6 2 3

Deleting first node
Modified Linked List: 15 11 5 6 2 3

请参阅完整文章在给定约束下删除链表中的给定节点以获取更多详细信息!