【问题标题】:Single LinkedList Remove Last Node单链表删除最后一个节点
【发布时间】:2016-12-16 23:31:17
【问题描述】:

使用我的教授给我的程序,当节点 p 到达最后一个节点时,它不应该退出循环吗?我将如何删除最后一个节点?

|____|--->|____|--->|这里|--->|NULL|

当 P 到达最后一个节点时。它满足 p.next!=null。因此它永远无法删除最后一个节点。

【问题讨论】:

  • 我想你忘记了循环何时继续p = p.next
  • @cricket_007 是正确的指出for loop 应该继续下一个操作(即设置p 等于p.next,在这种情况下为null)
  • 虽然,这段代码删除了e。你是想问一下要去掉尾巴吗?如果是这样,您可能会因为尝试重新编写提供给您的代码而感到困惑。

标签: java linked-list singly-linked-list


【解决方案1】:

虽然外部 for 循环一直到倒数第二个元素 p,但其中的 if 条件“p.next.element.equals(e)”检查 p 之后的元素,即当 p 是倒数第二个时的最后一个元素. 因此,您检查删除的元素实际上是 p.next 而 p 始终保留指向前一个元素的指针。这样 p.next = p.next.next 最终会删除 p.next。

【讨论】:

    【解决方案2】:

    Herefor loop 的文档,这是关于增量操作的内容:

    增量表达式在每次迭代后调用 环形;这个表达式增加或完全可以接受 减少一个值。

    因此,在您的情况下,p = p.next 在迭代完成后执行。因此,在删除 9 时,p 实际上会在 4 上,因此,p.next != null 不会失败。

    【讨论】:

    • 啊!因此,当它位于 4 时。我的 if 语句查看下一个值 9 并将该行从 4 更改为 null。
    【解决方案3】:

    当P到达倒数第二个节点时:

    |____|--->|P = HERE|--->|__e__|--->|NULL| //3 elements
    

    而 e 是最后一个节点(比如说),那么 p.next.element.equals(e) 变为 true,然后会发生这种情况:

    |____|--->|P = HERE|--->|NULL|<---|__e__|
    

    此时,你有 2 个元素的链表,最后一个节点被删除。

    【讨论】:

      【解决方案4】:

      您在上面发布的方法确实适用于删除最后一个元素。让我们跟踪代码并假设我们正在尝试删除节点 9。

      Method remove() is called
      p = head
      First iteration:
      p.next.element = 7 which doesn't equal 9
      p = p.next which is node 7
      Second iteration:
      p.next.element = 4 which doesn't equal 9
      p = p.next which is node 4
      Third iteration:
      p.next.element = 9 which equals 9 so now the if statement body gets executed
      p points at node 4 so the result of the if statement is
      
      Before:
      head -> 7 -> 4 -> 9 -> null
      After:
      head -> 7 -> 4 -> null
      
      Loop breaks and the method is over
      

      请注意,节点 9 已被 Java 的垃圾回收器删除,因为现在没有任何指向它的内容,因此无法访问它。

      但是,我对您的方法的唯一问题是请记住确保检查 head 是否为空;否则该方法将获得 NullPointerException。

      【讨论】:

        【解决方案5】:

        我想我明白为什么这可能会令人困惑。

        变量p 将在遍历列表时指向特定节点。它从head 节点开始。根据该图,head 节点不包含数据 - 它仅指向包含数据的第一个节点。 if 条件实际上是评估下一个节点中的值。因此,当您从列表中删除最后一个节点时,循环变量p 将指向倒数第二个节点。

        使用发布的示例(包含值 7、4、9 的列表)并尝试删除值 9,它是列表的最后一个元素。当p 指向包含4 的Node 时,if 条件将在p.next.element 中找到9。因此它会将p.nextnext 变量更改为指向p.next.next(它为空,因为p.next 是最后一个节点。

        【讨论】:

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