英文:
Is there a Java LinkedList method to use as a ring list?
问题
如果我有一个链表:
值 A B C D E F
索引 0 1 2 3 4 5
我想重新排列链表或者例如将索引为 D(索引 3)的元素作为新的头部,但保持顺序,如下:
值 D E F A B C
索引 0 1 2 3 4 5
这个功能是否可以直接通过链表来实现,基本上实现了一个环形结构?还有其他已经实现了这个功能的类吗?
英文:
If I have a LinkedList:
Value A B C D E F
Index 0 1 2 3 4 5
I want to reorder the list or an Iterator for example at D(index 3) to be the new head but keep the order like:
Value D E F A B C
Index 0 1 2 3 4 5
Is this a functionality that can be achieved with LinkedList out of the box, basically realizing a ring? Is there another class that offers this already implemented?
答案1
得分: 8
你可以对实现了 List
接口的类使用 Collections.rotate
方法:
List<String> list = Arrays.asList("A", "B", "C", "D", "E", "F");
Collections.rotate(list, 3);
System.out.println(list);
输出:
[D, E, F, A, B, C]
英文:
You can use Collections.rotate
for classes that implement the List
interface:
List<String> list = Arrays.asList("A", "B", "C", "D", "E", "F");
Collections.rotate(list, 3);
System.out.println(list);
Output:
[D, E, F, A, B, C]
答案2
得分: 2
不,这在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());
}
输出:
[A, B, C, D, E, F]
[D, E, F, A, B, C]
附注: 正如您所看到的,该方法接受了Deque
,因此您可以使用此接口的任何实现。
英文:
No, this is not possible using any standard class in Java. You have to create you own implementation base on any ordered random access collection like: Array, List.
Following solution probably not optimal, but it works and was written in 5 minutes.
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());
}
Output:
[A, B, C, D, E, F]
[D, E, F, A, B, C]
P.S. As you can see the method accepted Deque
, so you could use any implementation of this interface.
答案3
得分: 2
以下是翻译好的内容:
这里有一个非常简单的方法,使用 List::subList(int fromIndex, int toIndex)
:
List<String> list = Arrays.asList("A", "B", "C", "D", "E", "F");
int index = list.indexOf("D"); // 或者是一个固定的数字,取决于你的实现
List<String> newList = new ArrayList<>();
newList.addAll(list.subList(index, list.size())); // 右侧部分 [D, E, F] 首先
newList.addAll(list.subList(0, index)); // 左侧部分 [A, B, C] 其次
newList
将包含 [D, E, F, A, B, C]
,然而它并没有充分利用链式结构的优势。
英文:
Here is a really simple way using List::subList(int fromIndex, int toIndex)
:
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
The newList
will contain [D, E, F, A, B, C]
, however it doesn't use any advantage of the linked structures.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论