【问题标题】:How to remove the tail from singly linked list in data structure如何从数据结构中的单链表中删除尾部
【发布时间】:2020-01-19 15:39:08
【问题描述】:

我们不能轻易删除单链表的最后一个节点。甚至 如果我们维护一个直接指向列表最后一个节点的尾引用,我们必须能够 访问最后一个节点之前的节点以删除最后一个节点。但我们 无法通过从尾部跟随下一个链接到达尾部之前的节点。唯一的 访问这个节点的方法是从列表的头部开始,一路搜索 通过列表。但是这样一系列的链路跳跃操作可能需要很长时间 时间。

【问题讨论】:

  • 我认为您可能试图回答别人的问题而不是创建自己的问题,但是,如果不是,是的,您是绝对正确的。使用带有前一个节点指针的双向链表会花费更少的时间。
  • 在单链表数据结构中,要删除列表中的 any 节点,您必须从列表的 head 开始遍历列表并跟踪当前节点的前一个节点。

标签: data-structures linked-list singly-linked-list


【解决方案1】:

只需执行一个从i=0i<size 的for 循环,其中size 是该单链表中的节点数。下面代码中的条件next.getNext().getNext()==null 检查下一个节点之后的节点是否有引用null for next node Referencetail 然后它简单地设置null在下一个节点参考中。

请看下面的方法。

public void removeLast() {
        Node<E> next=head;
        for(int i=0; i<size; i++) {
            if(next.getNext().getNext()==null) {
                next.getNext().setNext(null);
                tail=next.getNext();
                size--;
            }
            next=next.getNext();
        }
    }

注意: getNext() 返回下一个节点的引用。

由于getNext() 返回Node 类型引用,所以我们可以调用next.getNext().getNext()

size 保留到目前为止创建的节点数。

【讨论】:

  • 您删除最后一个节点的逻辑不适用于带有1 节点的链表。
  • 是的,我们通常会创建 remove head() 函数。 public E removeFirst() { if(isEmpty()) { return null; } E 答案= head.getElement();头=头.getNext();尺寸 - ;返回答案; }
  • 我们也可以在答案中描述的方法中添加 if(size==1){removeFirst();}。
  • head 节点也是列表的一个节点。为什么要创建一个不同的函数来删除它?
  • 我正在创建它,因为在删除 head 节点时,我们应该将 null 分配给 head,因为如果我们不将 null 分配给 head,那么我们将无法找到链表的起点。其中head是类节点的变量
【解决方案2】:

删除单链表的最后一个节点至少需要 O(n) 时间复杂度。

但是,这可以通过使用双向链表在 O(constant) 内完成。

【讨论】:

  • 我只想使用单链表
猜你喜欢
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
相关资源
最近更新 更多