【问题标题】:Deleting the last node of a singly linkedlist删除单链表的最后一个节点
【发布时间】:2019-06-08 17:32:45
【问题描述】:

下面是删除单链表最后一个节点的函数。 我不明白,我们为什么要创建一个临时节点?我尝试在没有临时节点的情况下执行此操作并使用节点本身,但输出不会删除最后一个节点。 另外,既然我们使用的是临时节点,为什么我们返回节点而不是临时节点?我们没有对节点进行任何更改,那么节点是如何受到影响的呢?

public Node deleteLastNode(Node node)
{
    if (node.next == null || node == null)
        return null;
    Node temp = node;

    while (temp.next.next != null)
    {
        temp = temp.next;
    }
    temp.next = null;
    return node;
}

【问题讨论】:

  • 没有临时节点你将如何遍历列表?

标签: java singly-linked-list


【解决方案1】:

首先你需要把它切换成这样的条件

if (node.next == null || node == null) to 
if (node == null || node.next == null) 

这可能会导致空指针异常。 next..我认为 temp 需要在分配 null 之前保存数据,以便真正的引用不会丢失数据。

【讨论】:

    【解决方案2】:

    要将链表导航到它的最后一个节点,您需要一个指针(光标)指向您假设是最后一个等待测试的节点this.next == null

    如果没有临时节点(又名游标或指针),您如何与列表中的任何节点进行交互?

    【讨论】:

    • 对于链表的迭代,为什么我们不能使用节点本身。例如,如果我将 while 循环写为 while (node.next.next != null) 并且根本不创建临时变量怎么办。为什么那行不通?您仍然会遍历列表吗?
    【解决方案3】:

    我不明白我们为什么要创建一个临时节点?

    这是因为您将当前迭代节点存储在 temp 变量中。

    我尝试在没有临时节点的情况下执行此操作并使用节点本身,但输出不会删除最后一个节点。

    提供任何反馈所需的代码。

    另外,既然我们使用的是临时节点,为什么我们返回的是节点而不是临时节点?

    因为您要返回对列表头部的引用,所以它不再具有最后一个元素。

    我们没有对节点进行任何更改,那么节点如何受到影响?

    您正在删除此处的最后一个节点 temp.next = null;

    希望它能让你明白一点。

    【讨论】:

    • 对于链表的迭代,为什么我们不能使用节点本身。例如,如果我将 while 循环写为 while (node.next.next != null) 并且根本不创建临时变量怎么办。为什么这不起作用?
    • @Bobert,因为你将失去榜首
    【解决方案4】:

    通常使用temp 节点的原因是node 是链表的头/开始,这是我们拥有的链表的唯一表示(根据链表的定义)。因此,我们不想改变头部(或列表的表示),这就是从方法返回 node 的原因 - 这意味着我们在执行删除后返回更新的列表。

    【讨论】:

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