当前位置: 首页 > 知识库问答 >
问题:

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

谢英光
2023-03-14

我正在读取删除单链接列表的最后一个元素的算法。假设我有一个名为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;
}

我很困惑这个代码是如何工作的,因为一切都是通过“节点”。然而,当返回头时,最后一个节点被删除。因此,我想知道它是如何工作的,是否与Java中的“价值传递”有关?

共有3个答案

章海
2023-03-14

由于没有一个答案是明确的(我认为也不正确,因为如果我们有node.next.next,而我们只有1个元素,我们将得到一个NullPointerException),我想给我2美分。

有3种情况:

  1. 列表为空。直接、返回null或打印列表为空
  2. 列表中有1项。我们不能不计算就知道这一点(或者我们可以吗?),但请看下面的代码
  3. 列表中有多个项。浏览列表,为上一个设置一个临时变量,然后设置上一个。当您到达末尾时,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;

希望这能有所帮助。

孟华晖
2023-03-14

您可以注意到,该方法在所有节点中迭代,直到倒数第二个节点,因为最后一个节点的next将为null

while(node.next.next != null) {
    node = node.next;
}

上面的代码将为您提供最后一个节点,其下一个节点将使用节点设置为null。next=null 这意味着最后一个节点将成为最后一个节点。

南宫俊逸
2023-03-14

遍历列表的节点,直到node.next.next为空。此时,节点指的是倒数第二个节点,node.next指的是最后一个节点。将node.next设置为null将从列表中删除最后一个节点,因为列表中不再有节点引用它。

 类似资料:
  • 我们不能轻易地删除单链表的最后一个节点。即使我们维护一个直接指向列表中最后一个节点的尾部引用,我们也必须能够在最后一个节点之前访问该节点,以便删除最后一个节点。但是我们不能通过从尾部跟随下一个链接到达尾部之前的节点。访问此节点的唯一方法是从列表的开头开始,在整个列表中进行搜索。但是这样一系列的链路跳转操作可能需要很长时间。

  • 问题内容: 我的代码有一个问题,我做了一个示例程序来显示链接列表中的emp详细信息,现在当我尝试删除特定条目时出现问题意味着它无法正常工作,希望我在代码中犯了一些错误你能建议怎么做吗? 问题答案: 您无法在列表(添加,删除…项目)上进行迭代操作。您必须使用迭代器 参见http://docs.oracle.com/javase/6/docs/api/java/util/Iterator.html

  • 问题内容: 是否有删除范围的有效方法-说的尾巴-从X的元素,如在Java中? 显然有可能一个接一个地删除最后一个元素,这将导致O(X)级性能。至少在某些情况下,应该具有O(1)性能(通过在要删除的第一个元素周围设置参考并设置头/尾参考)。不幸的是,我看不到任何方法或一次全部删除最后一个元素。 目前,我正在考虑通过使用 替换 列表,但是不确定是否具有相同的性能。至少在代码中它会更清楚,另一方面,我会

  • 问题内容: 这段代码是一个表,可以选择“惰性名称”,“删除”,“显示”和“退出”。 该代码运行良好,但是我唯一的问题是如何删除节点中的所选名称 *我不知道如何删除节点。我应该在删除方法上加上什么? 问题答案: 要删除Node,您实际上需要更新它的上一个节点的位置以删除Node的位置,而剩下的Node最终将被垃圾回收。 如果要删除的节点是根节点,则只有一个问题,然后更新根节点。

  • 我在以递归方式从循环单链表中删除单个节点/值时遇到了一些问题(当然,如果可能的话)。我的代码只从中间删除,而不是从第一个或最后一个地方删除。 在以递归方式删除其中一个连接后,我不知道如何建立连接。我的意思是,如果我要删除第一个元素,那么我需要将最后一个节点连接到下一个节点。 这是我的代码: 参数和返回: 查找尾部功能:

  • 我有一个单链表。如果我想从这个链表中删除一个已知的元素,我能做什么? 例如:节点*头;(44)节点*尾部;(39) 链接列表:44 27 59 13 45 39我们想从中删除45。得到:4427591339 我只知道从列表中删除第一个元素(如果元素(需要删除)是列表的第一个元素)。我得到了:头=头- 如何从列表中删除中间节点?