【发布时间】:2019-03-04 10:10:59
【问题描述】:
我需要解决一个可以左右插入的问题。然后从数组中间的数据中提取出来。
我已经尝试使用链表来解决这个问题。然而,这种方法太慢而无法被接受为解决方案。
如果我需要在列表的开头和结尾快速插入以及快速检索中间元素,你会建议我使用什么数据结构?
这是我已经尝试过的代码:
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--;
}
}
}
【问题讨论】:
-
你可以保留3个指针(第一个、中间和最后一个元素)和列表的长度。
-
什么是“中间元素”?恰好位于当前列表中间的元素,还是原始结构开始的元素?如果您的列表是
0,并且您在右侧添加1, 2, 3,在左侧添加-1,即有-1, 0, 1, 2, 3,那么0或1会成为您的中间元素吗? -
中间指针的记账非常简单:每次在列表的开头(rest.end)发生2个连续插入时,将中间指针设置为其前任(resp.successor)
-
根据您的需要,您可能只使用两个链表,或者可能是一个自平衡二叉树(根是中间元素)。
-
@tobias_k 如果列表长度相等,则中间元素的索引大小为/2-1,否则为索引大小/2