我正在阅读算法以删除单个链接列表的最后一个元素。 假设我有一个名为ListNode的链接列表对象:
public class ListNode {
private int data;
private ListNode next;
public ListNode(int data) {
this.data = data;
}
public int getData() {
return this.data;
}
public void setData(int data) {
this.data = data;
}
public ListNode getNext() {
return this.next;
}
public void setNext(ListNode next) {
this.next = next;
}
}
我发现删除列表最后一个节点的方法是:
public ListNode deleteAtTail(ListNode head) {
if (head == null || head.next == null) return null;
ListNode node = head;
while(node.next.next != null) {
node = node.next;
}
node.next = null;
return head;
}
我很困惑这个代码是如何工作的,因为一切都是通过" node"。但是,当返回头时,最后一个节点被删除。 因此,我想知道它是如何工作的,它是否与价值相关"在Java?
答案 0 :(得分:5)
迭代列表的node
,直到node.next.next
为空。
此时,node
指的是倒数第二个节点,node.next
指的是最后一个节点。将node.next
设置为null将从列表中删除最后一个节点,因为列表中的任何节点都不再引用该节点。
答案 1 :(得分:1)
您可以注意到,该方法正在迭代所有节点,直到倒数第二个节点,因为最后一个节点的next
将为null
。
while(node.next.next != null) {
node = node.next;
}
上面的代码将为您提供倒数第二个节点,并使用null
将其下一个节点设置为node.next = null;
这意味着现在倒数第二个节点将成为最后一个节点。
答案 2 :(得分:1)
由于没有一个答案是清楚的(在我看来也不正确,因为如果我们有node.next.next并且我们只有1个元素,我们将得到一个NullPointerException),我想给我两分钱。
有三种情况:
所以,我的方法是将一个初始的前一个变量设置为null(假设你在列表的开头之前)。然后在while循环中,如果它有1个项目,它将不执行任何命令(它将跳过它并且prev将为null),否则,转到第3点。这是代码:
if(head == null) return;
ListNode iterator = head;
ListNode prev = null;
while(iterator.next !=null) {
prev = iterator;
iterator=iterator.next;
}
if(prev == null) head = null;
else prev.next = null;
希望这有帮助。