在Java中,从单链表中删除尾部是如何工作的
我正在阅读删除单链表最后一个元素的算法。 假设我有一个名为ListNode的链表对象:在Java中,从单链表中删除尾部是如何工作的,java,algorithm,singly-linked-list,Java,Algorithm,Singly Linked List,我正在阅读删除单链表最后一个元素的算法。 假设我有一个名为ListNode的链表对象: public class ListNode { private int data; private ListNode next; public ListNode(int data) { this.data = data; } public int getData() { return this.data; } pub
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;
}
我很困惑这段代码是如何工作的,因为一切都是通过“节点”完成的。但是,当返回head时,最后一个节点将被删除。
因此,我想知道它是如何工作的,它与Java中的“按值传递”有关吗?您迭代列表的
节点,直到节点。next.next
为空。
此时,节点
指的是倒数第二个节点,节点。下一个
指的是最后一个节点。将node.next
设置为null将从列表中删除最后一个节点,因为列表中不再有节点引用它。您可以注意到,该方法将遍历所有节点,直到最后一个节点的第二个节点,因为最后一个节点的next
将为null
while(node.next.next != null) {
node = node.next;
}
上面的代码将为您提供第二个最后一个节点,并且使用node.next=null将其next设置为null
代码>这意味着最后一个节点将成为最后一个节点 由于没有一个答案是明确的(我认为也不正确,因为如果我们有node.next.next,而我们只有1个元素,我们将得到一个NullPointerException),我想给我2美分
有3种情况:
列表为空。直接、返回null或打印列表为空
列表中有1项。我们不能不计算就知道这一点(或者我们可以吗?),但请看下面的代码
列表中有多个项。浏览列表,为上一个设置一个临时变量,然后在结束时将previous.next设置为null
因此,我的方法是将初始的前一个变量设置为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;
希望这能有所帮助。但一切都通过变量“node”而不是“head”。因此,当您将变量“node”的next节点设置为null时,如何删除head的最后一个元素。head
指列表的第一个节点,它指向第二个节点,它指向第三个节点,…,它指向下一个到最后一个节点,它指向最后一个节点。如果您更改这些指针中的任何一个(例如更改倒数第二个节点的指针),您就更改了列表。非常感谢,我终于找到了发生这种情况的原因。