使用该程序时,我的教授给了我,当节点p到达最后一个节点时不应该退出循环?我将如何删除最后一个节点?Single LinkedList删除最后一个节点
| ____ | ---> | ____ | ---> | 这里 | ---> | NULL |
当P到达最后一个节点时。它满足p.next!= null。因此它永远不能删除最后一个节点。
使用该程序时,我的教授给了我,当节点p到达最后一个节点时不应该退出循环?我将如何删除最后一个节点?Single LinkedList删除最后一个节点
| ____ | ---> | ____ | ---> | 这里 | ---> | NULL |
当P到达最后一个节点时。它满足p.next!= null。因此它永远不能删除最后一个节点。
虽然环外去,直到第二个最后一个元素说P,如果条件在它“p.next.element.equals(五)”检查的p后的元素,即最后当p是第二个时,元素。 所以你检查删除的元素实际上是p.next,而p总是保持一个指向前一个元素的指针。这样p.next = p.next.next最终删除p.next。
Here是for loop
的文件,这就是是说,对增值业务:
通过 循环每次迭代后的增量表达式被调用;这个表达式递增或递减一个值是完全可以接受的。
因此,在你的情况下,p = p.next
在迭代完成后被执行。所以,在删除9时,p
实际上将在4上,因此,p.next != null
不会失败。
啊!所以当它在4.我的if语句查看下一个值是9并将行从4改为为空。 –
当P到达倒数第二个节点:
|____|--->|P = HERE|--->|__e__|--->|NULL| //3 elements
和e是最后一个节点(例如),则p.next.element.equals(e)中为真,然后发生这种情况:
|____|--->|P = HERE|--->|NULL|<---|__e__|
此时,您有2个元素链接列表和最后一个节点删除。
您上面张贴的方法确实可以删除最后一个元素。让我们通过代码跟踪,假装我们正在试图删除节点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的垃圾回收,因为现在没有什么指向它删除了,有没有办法来访问它。
但是,我唯一的问题与你的方法是记得确保检查头是否为空;否则该方法将得到一个NullPointerException。
我想我明白为什么这可能会令人困惑。
变量p
将在列表中迭代时指向特定的节点。它从head
节点开始。根据该图,head
节点不包含数据 - 它仅指向包含数据的第一个节点。 if条件实际上是评估下一个节点中的值。因此,当从列表中删除最后一个节点时,循环变量p
将指向倒数第二个节点。
使用发布的示例(包含值7,4,9的列表)并尝试删除作为列表的最后一个元素的值9。当p
指向包含4的节点时,if条件将在p.next.element
中找到9。因此,这将改变未来p.next
变量指向p.next.next
(其为null,因为p.next
是最后一个节点。
我想你忘记了当循环使用'p持续约= p.next' –
@ cricket_007是正确地指出那'for循环'应该继续下一个操作(即设置p等于p.next,在这个例子中是null) – sova
虽然这段代码删除了'e',你是否试图询问即将删除如果是这样的话,你可能会试图重新编写给你的代码来混淆你自己 –