删除双向链表的头部

时间:2017-07-08 04:04:30

标签: doubly-linked-list

很抱歉这么低质量的问题,但我不知道为什么以下代码不起作用。

列表指向节点的头部。

void DeleteHeadNode(Node** list, Node * node)
    {
        if ((*list) == node) {
            Node * next = node->nextnode;
            next->prevnode = NULL;
        free(*list);
    }
}

2 个答案:

答案 0 :(得分:0)

我猜“不起作用”意味着list在你的功能之后不再有效 - 这将是真的。

你应该

void DeleteHeadNode(Node** list, Node* node)
{
    if ((node != NULL) && (*list == node))    // check node being deleted
    {
        Node* next = node->nextnode;
        if (next != NULL)                     // ensure next exists
        {
           next->prevnode = NULL;
           free(*list);
           list = &next;                      // update pointer to head of list
        }
        else                                  // no next, list is now becoming empty
        {
           free(*list);
           list = NULL;                       // update pointer to head of list
        }
    }
}

答案 1 :(得分:0)

Node**的使用用作别名。如果传递了列表变量的地址,可以通过更改Node*值来改变它。

通过这种方式,可以将传递的列表变量设置为null或第二个节点。

以下是使用模式。

void DeleteNode(Node** list, int data)
{
    while (*list != NULL && (*list)->data != data) {
        list = &(node->nextnode);
    }
    if (*list != NULL) {
        Node* found = *list;
        *list = found->nextnode;

        if (found->nextnode != NULL) {
            found->nextnode->prevnode = *list;
        }
        free(found);
    }
}

用法:

Node* list;
...
DeleteNode(&list, ...);

上一个节点(prevnode,双链表)并不是必需的。

感兴趣的是while循环:别名list从列表头设置到nextnode字段的地址。因此,*list的后续更改会更改传递的列表变量或某个nextnode字段。

void SortedInsertNode(Node** list, int data)
{
    Node* node = (Node*) malloc(sizeof(Node));
    node->data = data;
    node->prevnode = NULL;
    node->nextnode = NULL;
    while (*list != NULL && data >= (*list)->data) {
        node->prevnode = *list;
        list = &(node->nextnode);
    }
    node->nextnode = *list;
    *list = node;

    if (node->nextnode != NULL) {
        node->nextnode->prevnode = *list;
    }
}

删除头部:

void DeleteHead(Node** list)
{
    if (*list != null) {
        Node* dead = *list;
        *list = (*list)->nextnode;
        (*list)->prevnede = NULL;
        free(dead);
    }
}