我需要解决一个可以左右插入的问题。然后从数组中间的数据中提取。
我已经尝试使用链接列表解决此问题。但是,这种方法太慢了,不能被接受为解决方案。
如果我需要在列表的开头和结尾快速插入以及快速检索中间元素,您会建议使用哪种数据结构?
这是我已经尝试过的代码:
private static void middleQueue(int loopLength, String[] commandsArray) {
LinkedList<String> linkedList = new LinkedList<>();
int counterSize = 0;
for (int i = 0; i < commandsArray.length; i++) {
if(commandsArray[i].equals("R")){
linkedList.add(commandsArray[i+1]);
i++;
counterSize++;
}
else if(commandsArray[i].equals("L")){
linkedList.addFirst(commandsArray[i+1]);
i++;
counterSize++;
}
else if(commandsArray[i].equals("E")){
if((linkedList.size() & 1) == 0)
System.out.println(linkedList.remove((counterSize / 2)-1));
else
System.out.println(linkedList.remove((counterSize / 2)));
counterSize--;
}
}
}
答案 0 :(得分:1)
首先获取3个指针,中间,最后一个指针。 然后有2种情况:
(如果您先添加) 回答您需要将中间指针移动到左侧,然后移动到当前位置。
如果从最后添加 回答您只需要增加指向下一个的中间指针即可。
答案 1 :(得分:0)
正如其他人指出的那样,您需要一个带有3个指针的数据结构。
doubly linked list
会很好。但是,如果您将使用singly list list
(仅在一个方向上使用指针),那么您将只能左右移动(不能同时移动两个方向)。 SLL无法达到目的。
请参见此以实现非常类似的问题:https://www.geeksforgeeks.org/design-a-stack-with-find-middle-operation/
答案 2 :(得分:0)
在Java中,应该使用两个ArrayDeque
,一个用于列表的前半部,另一个用于后半部。将元素从一个移到另一个以保持它们的大小相同,因此您始终可以访问中间位置。
与使用LinkedList
相比,这将更快,内存效率更高。