Single LinkedList删除最后一个节点

时间:2016-12-16 23:31:18

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

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

| ____ | ---> | ____ | ---> |的此处 | ---> | NULL |

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

Program Provided by Prof

5 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

Herefor loop的文档,这是关于增量操作的说法:

  

每次迭代后都会调用increment表达式   环;这个表达式增量或完全可以接受   递减一个值。

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

答案 2 :(得分:0)

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

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

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

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

此时,您有2个元素链表,最后一个节点已删除。

答案 3 :(得分:0)

您在上面发布的方法确实可以删除最后一个元素。让我们浏览代码并假装我们尝试删除节点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

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

然而,我的方法唯一的问题是记得要确保检查头是否为空;否则该方法将获得NullPointerException。

答案 4 :(得分:0)

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

变量.main-nav a:first-child { color: orange; -webkit-transform: rotate(-50deg); transform: rotate(-50deg); } 将在迭代List时指向特定节点。它从p节点开始。根据图表,head节点不包含任何数据 - 它仅指向包含数据的第一个节点。 if条件实际上是在评估下一个Node中的值。因此,当您从列表中删除最后一个节点时,循环变量head将指向倒数第二个节点。

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