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

时间:2016-04-04 06:47:06

标签: 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;
    }

    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?

3 个答案:

答案 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),我想给我两分钱。

有三种情况:

  1. 列表为空。直截了当,返回null,或打印该列表为空。
  2. 列表有1个项目。我们无法知道这一点(或者我们可以吗?),但请看下面的代码
  3. 列表包含多个项目。浏览列表并为前一个设置临时变量,然后在结束时将previous.next设置为null。
  4. 所以,我的方法是将一个初始的前一个变量设置为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;
    

    希望这有帮助。