快速检索中间元素的数据结构

时间:2019-03-04 10:10:59

标签: algorithm data-structures

我需要解决一个可以左右插入的问题。然后从数组中间的数据中提取。

我已经尝试使用链接列表解决此问题。但是,这种方法太慢了,不能被接受为解决方案。

如果我需要在列表的开头和结尾快速插入以及快速检索中间元素,您会建议使用哪种数据结构?

这是我已经尝试过的代码:

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)

首先获取3个指针,中间,最后一个指针。 然后有2种情况:

  1. (如果您先添加) 回答您需要将中间指针移动到左侧,然后移动到当前位置。

  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相比,这将更快,内存效率更高。