📌  相关文章
📜  从没有头指针的链表中删除一个节点

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

从没有头指针的链表中删除一个节点

您将获得一个单链表和指向需要删除的节点的指针。没有给出关于头指针或任何其他节点的任何信息。您需要编写一个函数来从链表中删除该节点。您的函数将只接受一个参数:指向要删除的节点的指针。

注意:没有给你头部参考。保证要删除的节点不是最后一个节点;
例子:
链表构建为:

Defination of each node is as follows: 
struct Node {
    int data;
    struct Node* next;
};

Input : C (a pointer to C)
Output : A-->B-->D-->E-->F

Input : A (a pointer to A)
Output : B-->D-->E-->F

如果给出了头指针,这将是一个简单的单链表删除问题,因为要删除,您必须知道前一个节点,并且您可以通过从头指针遍历轻松到达那里。如果不知道需要删除的节点的前一个节点,常规删除是不可能的。
这里的技巧是我们可以将下一个节点的数据复制到要删除的当前节点的数据字段中。然后我们可以向前迈出一步。现在我们的下一个已成为当前节点,当前已成为前一个节点。现在我们可以通过常规的删除方法轻松删除当前节点。
例如,假设我们需要删除 C 并给出一个指向 C 的指针。如果我们有一个指向 B 的指针,我们可以很容易地删除 C。但是这里我们将D的数据字段复制到C的数据字段中。然后我们继续前进。现在我们在 D 并且我们有一个指向 C 的指针,即前一个指针。所以我们将删除 D。这就是节点 C 将被删除的方式。
下图是上述方法的试运行:

以下是上述方法的实现:

CPP
// C++ program to delete a node
#include 
using namespace std;
 
/* Link list node */
struct Node {
    int data;
    struct Node* next;
};
 
// Function to delete the node without head
void deleteNodeWithoutHead(struct Node* pos)
{
    if (pos == NULL) // If linked list is empty
        return;
    else {
 
        if (pos->next == NULL) {
            printf("This is last node, require head, can't "
                   "be freed\n");
            return;
        }
 
        struct Node* temp = pos->next;
 
        // Copy data of the next node to current node
        pos->data = pos->next->data;
 
        // Perform conventional deletion
        pos->next = pos->next->next;
 
        free(temp);
    }
}
 
// Function to print the linked list
void print(Node* head)
{
    Node* temp = head;
    while (temp) {
        cout << temp->data << " -> ";
        temp = temp->next;
    }
 
    cout << "NULL";
}
 
void push(struct Node** head_ref, int new_data)
{
    /* allocate node */
    struct Node* new_node = new Node();
 
    /* put in the data */
    new_node->data = new_data;
 
    /* link the old list off the new node */
    new_node->next = (*head_ref);
 
    /* move the head to point to the new node */
    (*head_ref) = new_node;
}
 
// Driver Code
int main()
{
    /* Start with the empty list */
    struct Node* head = NULL;
 
    // create linked 35->15->4->20
    push(&head, 20);
    push(&head, 4);
    push(&head, 15);
    push(&head, 35);
    cout << "Initial Linked List: \n";
    print(head);
    cout << endl << endl;
 
    // Delete 15 without sending head
    Node* del = head->next;
    deleteNodeWithoutHead(del);
 
    // Print the final linked list
    cout << "Final Linked List after deletion of 15:\n";
    print(head);
 
    return 0;
 
    // This code has been contributed by Striver
}


输出:
Initial Linked List: 
35 -> 15 -> 4 -> 20 -> NULL

Final Linked List after deletion of 15:
35 -> 4 -> 20 -> NULL