在链表中删除

时间:2014-12-24 17:55:17

标签: c++ singly-linked-list

  

Qn)如果只有一个指向要在单链表中删除的节点的指针,怎么做   你删除它?

我试图删除最后一个元素,即1,但else部分进入无限 循环打印垃圾值。

Original link

int main()
{
    struct Node* head = NULL;
    push(&head, 1);
    push(&head, 4);
    push(&head, 6);
    push(&head, 8);
    print(head);
    del_p(head->next->next->next);
    cout << endl;
    print(head);
    return 0;
}

void del_p(struct Node* current)
{
    struct Node* temp;
    if (current->next != NULL)
    {
        temp = current->next;
        current->data = temp->data;
        current->next = temp->next;
        free(temp);
    }
    else
    {
        free(current);
        current = NULL;
    }
}

3 个答案:

答案 0 :(得分:1)

您的函数的else分支会尝试将current重新分配给NULL。这是有问题的,因为current是传入指针的本地副本。也就是说,您无法修改原始指针的值。

这就是您接收垃圾的原因,因为您正在访问其内存已被解除分配的节点。

您需要双指针,或者最好是对节点的引用:

void del_p(struct Node*& current)

答案 1 :(得分:0)

如果传入要删除的节点和头节点,则可以循环,直到找到要删除的节点之前的节点。然后,您需要将先前节点指向要删除的节点所指向的节点,然后您可以释放要删除的节点。

void delete(struct Node* to_delete, struct Node* head)
{
    // check if node to be deleted is the head
    if (to_delete == head)
    {
        head = to_delete->next;
        return;
    }

    // make a local copy of the head just in case as to not alter it
    struct Node* tempHead = head;
    while(tempHead->next != to_delete)
    {
       tempHead = tempHead->next;
    }
    tempHead->next = to_delete->next;
    free(to_delete);
}

就像免责声明一样,我没有测试过这段代码,但从概念上说它应该可行。

答案 2 :(得分:0)

删除链表上节点的典型算法将遵循以下步骤:

  • temp开始Head指针。
  • 将您的temp移至要删除的节点(在这种情况下是最后一个节点:temp->next == NULL)。
  • 释放temp2
  • 的内存
  • temp->next的指针设置为NULL
  • 将指针返回head

现在这不是唯一的算法,有很多方法可以实现这一目标。以下代码将是我对函数del_p的解决方案(如果您想删除最后一个节点):

void del_p(struct Node *head)
{
    if (head != NULL)
    {
        struct Node *temp = head;
        while (temp->next != NULL) temp = temp->next;
        free(temp);
    }
}

您可以通过将指针传递给该节点(或值)来使此代码更通用,以便删除任何节点,代码如下所示:

void del_p(struct Node **head, struct Node *delete_node)
{
    if (head != NULL)
    {
        struct Node *temp = *head;
        if (temp == delete_node)
        {
            *head = (*head)->next;
            free(temp);
        }
        else
        {
            while (temp->next != NULL && temp->next != delete_node)
                temp = temp->next;
            if (temp->next != NULL && delete_node != NULL)
            {
                temp->next = delete_node->next;
                free(delete_node);
            }
        }
    }
}

希望这对您有用,此代码未经过测试,但请告诉我您是否遇到麻烦!