Реализация списка двойных ссылок в Java вручную

Мне нужна помощь в написании этого метода addAfterCurrent для моего PerformanceList, который представляет собой двусвязный список с объявленными стандартными головными, хвостовыми и курсорными (текущими) узлами. Класс узла использует

PerformanceNode следующий; PerformanceNode previous;

в качестве указателей они также установили и получают методы public void addAfterCurrent (PerformanceNode newPerformance)

Определение метода Вставляет новые данные в PerformanceList, так что новый узел следует непосредственно за текущим узлом, если он существует. Если текущего узла нет (т.е. текущий узел нулевой), просто вставьте узел в конец списка. Текущий узел теперь должен быть вновь созданным узлом

Мой текущий метод не вставляет узел после текущего узла. Это проблема, с которой мне нужна помощь, я не могу заставить ее установить newPerformance после текущего узла.

public void addAfterCurrent(PerformanceNode element)
    {
        PerformanceNode temp = element;
        if (cursor == null)
        {
        head = temp;
        tail = temp;
        cursor = temp;
        }
        else
        {
            temp.setNext(cursor);
            cursor.setPrev(temp);

            cursor = temp;

            if(cursor == null)
            {
                tail = cursor;
            }
        }

    }

person Community    schedule 24.02.2015    source источник
comment
В настоящее время он устанавливает указатель prev узла после него. Разве он не должен также установить указатель next узла перед ним? В противном случае вы увидите узел при движении назад, но не при движении вперед.   -  person user253751    schedule 24.02.2015


Ответы (1)


Я реализовал с некоторыми комментариями по определению:

public void addAfterCurrent(PerformanceNode node) {
    if (node == null)  {
        throw new IllegalArgumentException("Node to be added cannot be null!");
    }

    if (cursor == null && tail == null) {
        throw new IllegalStateException("There is neither current nor tail node!");
    }

    if (cursor == null) { // there is no current node
        // insert the node at the end of the list
        tail.setNext(node);
        node.setPrev(tail);

        // mode end cursor
        tail = node; 

        // current node should now be the newly created node
        cursor = node;
    } else { // there is current node
        PerformanceNode temp = cursor.getNext();

        // new node directly follows the current node 
        cursor.setNext(node);
        node.setPrev(cursor);

        if (temp != null) {
            node.setNext(temp);
            temp.setPrev(node);
        } else { // current node was the last node
            tail = node; // mode end cursor
        }
    }
}
person Marcelo Keiti    schedule 24.02.2015