Java Util Linked List - как найти следующий?

При использовании Java LinkedList как вы узнаете следующий или предыдущий элемент:

Я имею в виду, что в регулярном связанном списке я бы сделал что-то вроде этого:

Node node1 = new Node();
Node node2 = new Node();
LinkedList list = new LinkedList();
list.add(node1);
list.add(node2);

//then my node1 will know who it next is:
assertEquals(node2, node1.next());

где Node - мой собственный контейнер для данных/объектов.

Но в Java LinkedList данные, похоже, не изменяются. Итак, как я действительно узнаю, кто является элементом "следующий" (или "предыдущий" в случае дважды связанных списков)?

Ответы

Ответ 1

Вы не можете. LinkedList - это просто реализация списка и больше ничего не предлагает. Вам нужно будет сделать свой собственный.

Для node1.next() вам понадобится ссылка из node1 в список. На самом деле вам понадобится несколько ссылок, так как node1 может быть несколько раз. Более того, он может содержаться в нескольких списках.

Возможно, вы можете использовать ListIterator для этого.

Ответ 2

Я не знаю, какой класс Node вы используете, но LinkedList<T> имеет свой собственный внутренний класс node, к которому у вас нет доступа. Вызов add добавит значение в список - вы не можете явно вставить node, удерживая значение, или получить доступ к самим узлам любым другим способом. Да, иногда это может быть больно.

Если вам нужен связанный список с общедоступной инкапсуляцией node, вам нужно будет найти другую реализацию или свернуть свою собственную.

Ответ 3

Лучшее решение: Создайте свой собственный следующий и последний ссылки при создании нового объекта Item Item:

Просто введите объект lastInserted где-то более глобально

public MyLinkedListItem(){
    if(lastInserted != null){
        lastInserted.next = this;
        this.last = lastInserted;
    }
    lastInserted = this;
}

Ответ 4

"Связанная" часть имени класса LinkedList относится только к ее реализации. Интерфейс не предоставляет явные методы для выполнения того, что вы хотите.

LinkedList реализует интерфейс Collection (и List), поэтому с учетом индекса i элемента в списке list вы можете получить предыдущие и следующие элементы с list.get(i-1) и list.get(i+1) соответственно. Для LinkedList реализация этих методов выполняется довольно медленно. Если вы выполняете большую часть предыдущей/следующей операции, подумайте о том, чтобы реализовать свой список или использовать ArrayList.

Ответ 5

Я должен не согласиться с принятым ответом. Вы можете, если у вас есть элемент головы. Как только вы теряете ссылку на первый элемент, удаляя и не возвращая следующий элемент или вставляя элемент перед первым элементом и не возвращаете его, вы не сможете выполнять поиск.

Ответ 6

Вы можете использовать итератор для перемещения по узлам, например:

    Node node1 = new Node();
    Node node2 = new Node();
    LinkedList list = new LinkedList();
    list.add(node1);
    list.add(node2);

    Iterator <Node> m_iterator=list.iterator();

    //set iterator to first node
    m_iterator.next();

    //then my node1 will know who it next is:
    assertEquals(node2, m_iterator.next());