使用该程序,我的教授给了我,当节点p到达最后一个节点时,它不应该退出循环吗?我该如何删除最后一个节点?
| ____ | ---> | ____ | ---> |的此处 | ---> | NULL |
当P到达最后一个节点时。它满足p.next!= null。因此,它永远不会删除最后一个节点。
答案 0 :(得分:0)
虽然外部for循环直到第二个最后一个元素表示p,但是其中的if条件“p.next.element.equals(e)”检查p之后的元素,即当p是最后一个时的最后一个元素。 因此,检查删除的元素实际上是p.next,而p始终保持指向前一个元素的指针。这样p.next = p.next.next最终会删除p.next。
答案 1 :(得分:0)
Here是for 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
是最后一个节点,因此为空。