是否有Java LinkedList方法可用作环列表?

是否有Java LinkedList方法可用作环列表?,java,list,linked-list,Java,List,Linked List,如果我有LinkedList: Value A B C D E F Index 0 1 2 3 4 5 我想对列表或迭代器重新排序,例如在D(索引3)处,作为新的头,但保持如下顺序: Value D E F A B C Index 0 1 2 3 4 5 这是一个功能,可以实现与LinkedList开箱即用,基本上实现了一个环?是否有另外一个类已经实现了这个功能?不,在Java中使用任何标准类都不可能做到这一点。您必须在任何有序随机访问集合(如:数组、列表)的基础上创建自己的实现 下面的解决

如果我有LinkedList:

Value A B C D E F
Index 0 1 2 3 4 5
我想对列表或迭代器重新排序,例如在D(索引3)处,作为新的头,但保持如下顺序:

Value D E F A B C
Index 0 1 2 3 4 5

这是一个功能,可以实现与LinkedList开箱即用,基本上实现了一个环?是否有另外一个类已经实现了这个功能?

不,在Java中使用任何标准类都不可能做到这一点。您必须在任何有序随机访问集合(如:数组、列表)的基础上创建自己的实现

下面的解决方案可能不是最优的,但它是有效的,并且是在5分钟内编写的

public static void main(String... args) throws IOException {
    Deque<Character> deque = new LinkedList<>();
    deque.addAll(Arrays.asList('A', 'B', 'C', 'D', 'E', 'F'));
    System.out.println(deque);
    reorder(deque, 3);
    System.out.println(deque);
    reorder(deque, 3);
}

public static void reorder(Deque<Character> deque, int offs) {
    offs %= deque.size();

    for (int i = 0; i < offs; i++)
        deque.add(deque.removeFirst());
}

p.S.正如您所看到的,该方法已被接受
Deque
,因此您可以使用此接口的任何实现。

以下是一种非常简单的方法:

List List=Arrays.asList(“A”、“B”、“C”、“D”、“E”、“F”);
int index=list.indexOf(“D”);//或一个固定的数字,取决于您的实现
List newList=newarraylist();
newList.addAll(list.subList(index,list.size());//首先是右部分[D,E,F]
newList.addAll(list.subList(0,索引));//左部分[A,B,C]然后
新列表
将包含
[D,E,F,A,B,C]
,但是它没有利用链接结构的任何优点。

您可以用于实现
列表
接口的类:

List List=Arrays.asList(“A”、“B”、“C”、“D”、“E”、“F”);
集合。轮换(列表,3);
系统输出打印项次(列表);
输出


[D,E,F,A,B,C]

是否可能不重新排列元素?您可以通过执行类似于
(i+offset)%length
(注意负数)的操作来更改访问元素的索引。
集合。
旋转(…)
空间复杂度为
O(n)
,时间复杂度为
3*O(n)
-我说得对吗?我的想法和您一样,但是会使用一个而不是
LinkedList
@AlexR我想初始列表是可以修改的,不需要再创建一个。@AlexR:
LinkedList
ArrayQue
唯一的优点是它还实现了
list
ArrayDeque
作为纯双端队列更好。这并不意味着答案是错的。@Nikolas我不是故意说它是错的。文档中仅说明“[ArrayDeque]在用作队列时可能比LinkedList快。”这一回答确实如此。@Nikolas在问题中说我们有一个
LinkedList
——没有其他任何东西。
[A, B, C, D, E, F]
[D, E, F, A, B, C]
List<String> list = Arrays.asList("A", "B", "C", "D", "E", "F");

int index = list.indexOf("D"); // or a fixed number, depends on your implementation

List<String> newList = new ArrayList<>();
newList.addAll(list.subList(index, list.size()));  // right part [D, E, F] first
newList.addAll(list.subList(0, index));            // left part [A, B, C] then