【问题标题】:Is it possible to delete the last node in a linked list?是否可以删除链表中的最后一个节点?
【发布时间】:2013-08-07 07:11:16
【问题描述】:

例如,有一个练习说:

写一个函数从链表中删除一个节点,只给出那个指针

这就是解决方案:

void deleteNode(Node* toDelete) {

    // this function essensially first copies the data from the next pointer
    // and then, deletes the next pointer
    // However, it doesn't work if trying to delete the last element in the list

    Node *temp = toDelete->next;    // create a temp, assign to the one after toDelete
    toDelete->data = temp->data;    // change toDelete's data to the one's after it
    toDelete->next = temp->next;    // change toDelete's next to the one's after it

    delete temp;
    temp = nullptr;
}

如果指针最后一个节点,我如何更改我的解决方案以删除链接列表中的 last 元素?

【问题讨论】:

  • 最后一个节点与其他节点有何不同,您如何对此进行测试?
  • 它什么都没有?接下来是一个nullptr
  • 所以也许您可以使用该信息为该节点做一些不同的事情。
  • 好吧,如果它是一个单链表,而你没有访问到表头的权限,你就做不到。

标签: c++ algorithm data-structures linked-list


【解决方案1】:

显然你不能;前一个节点指向一个有效节点,没有办法改变它。

您可以做的是在列表末尾添加一个哨兵节点。您永远不会删除该节点,也永远不会使用它来存储数据。然后您的解决方案将适用于所有数据节点。这不需要对节点结构进行任何更改,但需要更改您遍历列表的方式。

【讨论】:

  • 我想知道“我不允许更改结构”下是否会禁止这样做。我认为它会,但我给你+1假设它不会:-)
【解决方案2】:

不,单链表是不可能的。

原因是需要修改倒数第二个节点(使其next指针为空)。但是没有办法从最后一个节点中找到那个节点。

一般来说,你不能从单链表中删除一个节点,只给一个指向该节点的指针。

您当前所做的基本上是“作弊”,因为您并没有真正删除指向的节点。您正在改变列表,然后删除指向的节点的后继节点。当您调用此函数时,如果某处的其他代码位持有指向该后继程序的指针,这会有所不同——它们的指针无效。所以你删除了指向的数据元素,但你没有删除指向的节点。

【讨论】:

  • 明确一点:这将适用于所有节点,而不仅仅是最后一个,对吧?
  • @juanchopanza:同意。我是这么说的,但后来我解释了为什么提问者的当前代码看起来像是删除了指向的节点,但实际上并没有。
【解决方案3】:

为了处理删除单个链表中的节点,您需要在之前和之后修改节点。

            +-----+  +----------+  +------+
header----->|     |->| toDelete |->|      |
            +-----+  +----------+  +------+

你需要一个指向列表第一个元素的指针,否则由于数据结构的性质,你不可能做你想做的事。

首先找到需要删除的节点之前的节点,例如

Node* before = header;
for (;before->next != toDelete; before = before->next) {;}

现在做before->next = toDelete->next 如果toDelete 是最后一个节点,它将是一个nullptr,否则一个指向下一个节点的指针

(当然你需要删除toDelete在这两种情况下指向的内容)

【讨论】:

    猜你喜欢
    • 2016-06-11
    • 1970-01-01
    • 2013-03-25
    • 2014-05-22
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多