【问题标题】:Circularly linked list remove tail without loop循环链表不带循环删除尾部
【发布时间】:2015-06-05 15:32:46
【问题描述】:

我尝试实现一个循环链表,并且我读过删除尾部(具有直接引用)的复杂性是 O(1)。但是,如果不循环,我就无法摆脱尾部引用,导致复杂度为 O(n),所以我想知道如果不循环,这是否可能?

    remove =   tail;
    prev        =   temp    =   tail.getNext();

    do
    {
        prev    =   temp;
        temp    =   temp.getNext();
    }
    while(!temp.getNext().equals(tail.getNext()));

    prev.setNext(temp.getNext());
    size--;
    return remove;

注意:prev、temp、remove 是本地的,tail 是列表的尾部,tail.getNext() 的第一个实例是头部。

我也尝试过以下方法,但它不起作用,因为 tail 之前的节点仍然指向 tail 并且引用没有被删除。我知道我需要将尾巴的前一个点指向头部才能删除尾巴,上面的代码就是这样做的,但我只是不确定如何做到这一点,以及是否可以不循环遍历列表..

    remove =   tail;
    tail=   lastNode.getNext();
    size--;
    return remove;

【问题讨论】:

  • 您需要循环查找尾节点的上一个节点..然后将上一个节点指向头节点的下一个引用。要查找尾节点的上一个,您需要循环直到找到下一个节点的下一个是头节点。

标签: java algorithm data-structures


【解决方案1】:

循环链表中,每个节点都有一个上一个下一个。有head指针指向第一个节点,它的前一个是尾节点,下一个是头节点。

所以

Node removeTail() {
     if (head == null) {
         return null;
     }

     Node tail = head.previous;
     Node newTail = tail.previous;
     newTail.next = head;
     head.previous = newTail;

     if (head == tail) {
         head = null;
     }
     --size;
     return tail; // If so desired.
}

【讨论】:

  • 但如果它的单数不是双循环,我猜它不会有前一个节点.. 如果它的双循环并且你的答案是完美的,我猜
  • @virendrao 对,我自动假设了双链接,但是在 java 中,即使您在 List 类中有一个尾字段,也无法获得 O(1) 删除。
  • 同意.. 是的,如果单链接需要循环到尾​​节点,您的答案是双链接
  • 是的,我的是单链接的。那么可能会尝试使用双链接实现。你会说双链接比单链接更有效吗?如果是这种情况,是否会在任何情况下使用单链接而不是双链接?
  • @joe 可能是这个帮助stackoverflow.com/questions/15563043/…
猜你喜欢
  • 1970-01-01
  • 2020-12-03
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多