+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.ListIterator;
+import java.util.concurrent.TimeUnit;
+
+class Main {
+
+ private static <E> void addMiddle(ArrayList<E> array, E value) {
+ int mid = array.size() / 2;
+ array.add(mid + 1, value);
+ }
+
+ private static <E> void addMiddle(LinkedList<E> list, E value) {
+ int mid = list.size() / 2;
+ list.add(mid + 1, value);
+ }
+
+ /**
+ * Should mimic the collection add(int index, T value) method
+ * @param array [description]
+ * @param value [description]
+ * @return [description]
+ */
+ private static <E> void addMiddleIter(ArrayList<E> array, E value) {
+ int mid = array.size() / 2;
+ ListIterator<E> iter = array.listIterator();
+ int i = 0;
+ // go to the element at mid index
+ while (iter.hasNext() && i < mid) {
+ iter.next();
+ i++;
+ }
+ iter.next(); // Insert before mid + 1
+ iter.add(value);
+
+ }
+
+ /**
+ * Should mimic the collection add(int index, T value) method
+ * @param list [description]
+ * @param value [description]
+ * @return [description]
+ */
+ private static <E> void addMiddleIter(LinkedList<E> list, E value) {
+ int mid = list.size() / 2;
+ ListIterator<E> iter = list.listIterator();
+ int i = 0;
+ // go to the element at mid index
+ while (iter.hasNext() && i < mid) {
+ iter.next();
+ i++;
+ }
+ iter.next(); // Insert before mid + 1
+ iter.add(value);
+ }
+
+ private static <E> void addNEMiddle(ArrayList<E> array, int Nelements) {
+ ListIterator<E> iter = array.listIterator();
+ int i = 0;
+ // go to the element at the middle index
+ while (iter.hasNext() && i < array.size() / 2) {
+ iter.next();
+ i++;
+ }
+ iter.next(); // Insert before mid + 1
+ for (int j = 0; j < Nelements; j++) {
+ iter.add((E)new Object());
+ }
+ }
+
+ private static <E> void addNEMiddle(LinkedList<E> list, int Nelements) {
+ ListIterator<E> iter = list.listIterator();
+ int i = 0;
+ // go to the element at the middle index
+ while (iter.hasNext() && i < list.size() / 2) {
+ iter.next();
+ i++;
+ }
+ iter.next(); // Insert before mid + 1
+ for (int j = 0; j < Nelements; j++) {
+ iter.add((E)new Object());
+ }
+ }
+
+ /**
+ * The main() function
+ * @param String[] args main() function arguments array
+ */
+ public static void main(String[] args) {
+ ArrayList<Integer> array = new ArrayList<Integer>();
+ LinkedList<Integer> list = new LinkedList<Integer>();
+
+ for (int i = 0; i < 1000000; i++) {
+ array.add(i);
+ list.add(i);
+ }
+
+ long startTime = System.nanoTime();
+ //for (int i = 0; i < 100000; i++) {
+ // addMiddleIter(array, i);
+ //}
+ addNEMiddle(array, 100000);
+ long stopTime = System.nanoTime();
+ long execTime = stopTime - startTime;
+ //System.out.println("Insert time in the middle of the ArrayList: " + TimeUnit.NANOSECONDS.toSeconds(execTime) + " s");
+ System.out.println("Insert time in the middle of the ArrayList: " + execTime + " ns");
+
+ startTime = System.nanoTime();
+ //for (int i = 0; i < 100000; i++) {
+ // addMiddleIter(list, i);
+ //}
+ addNEMiddle(list, 100000);
+ stopTime = System.nanoTime();
+ execTime = stopTime - startTime;
+ //System.out.println("Insert time in the middle of the LinkedList: " + TimeUnit.NANOSECONDS.toSeconds(execTime) + " s");
+ System.out.println("Insert time in the middle of the LinkedList: " + execTime + " ns");
+ }
+}