【问题标题】:Delete last node of single linked list using tail pointer使用尾指针删除单链表的最后一个节点
【发布时间】:2018-01-13 10:31:00
【问题描述】:

我在 C 中创建一个单链表,它具有头和尾指针,其中头指针指向 SLL 的起始节点,尾指针指向 SLL 的最后一个节点。我不想使用头指针遍历到列表末尾来删除节点。有没有办法让我可以使用尾指针删除 SLL 的最后一个元素?

以下是节点添加功能。 head 和 tail 初始化为 NULL。

void add_node_last(Node** head, Node** tail, int data) {

    Node* new_node = (Node *) malloc(sizeof(Node));

    new_node -> data = data;
    new_node -> ptr  = NULL;

    if(*head == NULL && *tail == NULL) {
        *head = new_node;
        *tail = new_node;
        return;
    }

    (*tail) -> ptr = new_node;

    *tail = new_node;

}

要删除第一个节点,使用以下函数:

void del_first(Node **head) {
    if(*head == NULL) {
        return;
    }
    *head = (*head) -> ptr;
    free(*head);
}

【问题讨论】:

  • 顺便说一句 free(*head); 是错误的。
  • @BLUEPIXY 那么正确的说法是什么?
  • Node *temp = *head; *head = (*head) -> ptr; free(temp); 另外如果变成*head == NULL 则需要将tail设置为NULL。
  • 你能详细说明为什么错了吗?
  • 更新后会破坏列表。

标签: c pointers linked-list singly-linked-list


【解决方案1】:

为了让它在不使其成为双向链表的情况下工作,您可以让尾部的 *next 指针指向列表的头部,然后遍历它直到到达尾部之前的节点。在那里,您可以将其 *next 指针设为 NULL,这实际上会将原始尾部从列表中分离出来。然后将尾部设置为当前节点,最后释放原始尾部。

void del_last(Node **head, Node **tail) {
    struct node *new_head = *head;
    struct node *current = *tail;

    current->next = head;

    while(current-> != *tail)    //getting the node right before the original tail
    {
         current = current->next
    }

    current->next = NULL;   //detaches original tail form list

    free(**tail);   //gets rid of original tail
    **tail = current;   // sets current node to tail pointer
} 

【讨论】:

    【解决方案2】:

    您可以释放节点的内存,但只能释放一次。第一次删除后,您的尾指针和倒数第二个节点的 ptr 将是无效指针。为了确保两个指针始终正确,您要么需要遍历整个列表,要么将其设为双向链表。

    说“不”还有很长的路要走(感谢@stark)。

    【讨论】:

    • 尾指针和最后一个节点的ptr都会出错。所以正确答案只是“不”
    • @stark 如果 tail 指向最后一个节点,你会 free(tail); 但是如果不遍历整个列表,就无法在此之后更新 tail。
    • @stark 我明白你在说什么。我将“删除”读作简单地释放内存。但是要真正删除节点,您必须遍历整个列表。我会更新答案。
    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 2016-06-11
    • 2013-03-25
    • 1970-01-01
    相关资源
    最近更新 更多