Как переместить в хвост все элементы, которые остаются до определенного элемента в LinkedList? - PullRequest
2 голосов
/ 22 января 2012

У меня есть вопрос относительно LinkedList, который я использую для реализации очереди. Как переместить в хвост все элементы, которые остаются до определенного элемента? Допустим, мне нужно переместить в хвост все элементы, которые остаются до 3-го элемента (см. Пример ниже). Это означает, что числа 1 и 2 должны быть перемещены в хвост, чтобы получить: 3->4->1->2.

Можно ли сделать что-то похожее на list1.moveToTheTail(startElem,endElem);, где startElem и endElem указывают границы элементов, которые нужно переместить в хвост?

import java.util.LinkedList;

public class Test {
    public static void main(String[] args) {
        LinkedList<Integer> list1 = new LinkedList<Integer>();
        list1.addLast(1);
        list1.addLast(2);
        list1.addLast(3);
        list1.addLast(4);
        list1.
        System.out.println(list1);
    }
}

Ответы [ 4 ]

1 голос
/ 22 января 2012

Используйте методы poll и add , чтобы переместить элементы от головы к хвосту Queue:

public static void moveToTail(int nElements, Queue<?> queue) {
    // Do some checkings here if necessary
    for(int i = 0 ; i < nElements ; ++i) {
        queue.add(queue.poll());
    }
}
1 голос
/ 22 января 2012

нет такой функции нет ... жаль, потому что операция перемещения вперед-назад - это только изменение «указателя» на первый элемент.

Но вы хотите, чтобы функция также перемещалась из середины списка ... вот так:

public static void moveToTail(LinkedList<?> list,int startElement, int endElement) {
    if (startElement <0 )
        return ;
    if (endElement < startElement)
        return;
    if (endElement >= list.size())
        return;
    for(int i = startElement ; i < endElement ; ++i) {
         //yeah it has to be startElement and not i
         list.addLast(list.remove(startElement));
    }
}
1 голос
/ 22 января 2012

Удалите их и добавьте заново, начиная с первого.

0 голосов
/ 22 января 2012

Попробуйте этот метод, он изменит список на месте:

public static <T> List<T> moveToTheTail(List<T> list, int startElem, int endElem) {
    for (int i = startElem; i < endElem; i++)
        list.add(list.remove(startElem));
    return list;
}

Приведенный выше метод предполагает, что индексы действительны для списка. Используйте это так:

List<Integer> list1 = new LinkedList<Integer>();
list1.add(1);
list1.add(2);
list1.add(3);
list1.add(4);

list1 = moveToTheTail(list1, 0, 2);
System.out.println(list1);

Все элементы между индексом startElem и меньше, чем endElem, будут удалены из списка и добавлены в конец. А так как он использует дженерики, он работает для любого класса, который реализует интерфейс List, содержащий элементы любого типа.

...