java—删除作为队列实现的linkedlist中插入的任何对象

sg24os4d  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(275)

我有一个linkedlist实现为队列。remove(object)方法可以在队列的任何位置删除对象,据我所知,这与队列的fifo概念相矛盾。我的理解错了。

Queue<Object> q= new LinkedList<>();
//assuming objects have been inserted 
q.remove(a); //this removes the object 'a' present anywhere in the Queue.
thigvfpy

thigvfpy1#

出于好奇,我研究了linkedlist对象和集合接口中的remove方法。remove函数的作用是遍历节点,找到对象,然后取消对象的链接。

public boolean remove(Object o) {
    if (o == null) {
        for (Node<E> x = first; x != null; x = x.next) {
            if (x.item == null) {
                unlink(x);
                return true;
            }
        }
    } else {
        for (Node<E> x = first; x != null; x = x.next) {
            if (o.equals(x.item)) {
                unlink(x);
                return true;
            }
        }
    }
    return false;
}

现在,unlink方法基本上是和一个节点一起工作的,就像queue一样,通过左、右迭代来找到那个对象。另外,请记住,这个对象有一个modcount,它跟踪修改并实现快速失败行为(如果出现错误)

E unlink(Node<E> x) {
    // assert x != null;
    final E element = x.item;
    final Node<E> next = x.next;
    final Node<E> prev = x.prev;

    if (prev == null) {
        first = next;
    } else {
        prev.next = next;
        x.prev = null;
    }

    if (next == null) {
        last = prev;
    } else {
        next.prev = prev;
        x.next = null;
    }

    x.item = null;
    size--;
    modCount++;
    return element;
}

不是一个完整的答案,但是,你可以看到,它穿越节点。也许你可以通过书籍和教程来研究big o和算法。然而,简单地说,linkedlist是一种混合包,在这里和那里实现。所以,fifo将被保持,索引将被保持跟踪,但是,将遍历做删除以外的切割头或尾节点。

相关问题