如何删除指向链表的指针中的节点?

How to remove a node in a pointer to linked list?

我试图在返回其值时删除链表的最后一个节点。但是所有这些指针都令人困惑,就像我真的通过调用 p = NULL 删除它一样吗??

typedef struct node {
    ElemType val;
    struct node *next;
} NODE;

struct list_struct {
    NODE *front;
    NODE *back;
};

/**
If list is empty, do nothing and return arbitrary value
otherwise, the last element in the list is removed and its value is returned.
**/
ElemType popBack(LIST *l) {
    NODE *p = l->front;
    NODE *previous = NULL;
    while (p != NULL) {
        if (p->next == NULL) {
            ElemType value = p->val;
            p = NULL;
            l->back = previous;
            return value;
        }
        previous = p;
        p = p->next;
    }
    return DEFAULT;
}

对于初学者来说,使用 singly-linked 列表来删除其最后一个元素并不是一种有效的方法。在这种情况下,您应该使用 doubly-linked 列表。

然而在任何情况下你都需要释放被删除节点占用的内存并正确更新指针back以及列表的指针front和数据成员[=指针的 13=] previous.

函数可以如下所示

ElemType popBack( LIST *l)  
{
    ElemType value = DEFAULT;

    if ( l->front != NULL )
    {
        if ( l->front->next == NULL )
        {
            value = l->front->val;
            free( l->front );
            l->front = l->back = NULL;
        }
        else
        {
            node *current = l->front;

            while ( current->next->next != NULL )
            {
                current = current->next;
            }
        
            value = current->next->val;
        
            free( current->next );
            current->next = NULL;

            l->back = current;
        }
    }

    return value;
}