2016-12-16 151 views
0

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

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

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

Program Provided by Prof

+1

我想你忘记了当循环使用'p持续约= p.next' –

+0

@ cricket_007是正确地指出那'for循环'应该继续下一个操作(即设置p等于p.next,在这个例子中是null) – sova

+0

虽然这段代码删除了'e',你是否试图询问即将删除如果是这样的话,你可能会试图重新编写给你的代码来混淆你自己 –

回答

0

虽然环外去,直到第二个最后一个元素说P,如果条件在它“p.next.element.equals(五)”检查的p后的元素,即最后当p是第二个时,元素。 所以你检查删除的元素实际上是p.next,而p总是保持一个指向前一个元素的指针。这样p.next = p.next.next最终删除p.next。

0

Herefor loop的文件,这就是是说,对增值业务:

通过 循环每次迭代后的增量表达式被调用;这个表达式递增或递减一个值是完全可以接受的。

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

+0

啊!所以当它在4.我的if语句查看下一个值是9并将行从4改为为空。 –

0

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

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

和e是最后一个节点(例如),则p.next.element.equals(e)中为真,然后发生这种情况:

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

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

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 

注意,节点9是由Java的垃圾回收,因为现在没有什么指向它删除了,有没有办法来访问它。

但是,我唯一的问题与你的方法是记得确保检查头是否为空;否则该方法将得到一个NullPointerException。

0

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

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

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