Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,从单链表中删除尾部是如何工作的_Java_Algorithm_Singly Linked List - Fatal编程技术网

在Java中,从单链表中删除尾部是如何工作的

在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

我正在阅读删除单链表最后一个元素的算法。 假设我有一个名为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;
}
我很困惑这段代码是如何工作的,因为一切都是通过“节点”完成的。但是,当返回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
    指列表的第一个节点,它指向第二个节点,它指向第三个节点,…,它指向下一个到最后一个节点,它指向最后一个节点。如果您更改这些指针中的任何一个(例如更改倒数第二个节点的指针),您就更改了列表。非常感谢,我终于找到了发生这种情况的原因。