【发布时间】:2020-03-29 16:27:49
【问题描述】:
您好,我在 ArrayList 和 LinkedList 的索引上添加元素时遇到问题。我不知道该怎么做。
我有这个 ArrayList 类,我必须在索引上添加元素,但我不知道怎么做。(这个 ->public void add(Object element, int index) in both arrayList 和 linkedList)
public class ArrayList implements List {
private Object[] elements = new Object[0];
@Override
public void add(Object element) {
Object[] newElements = new Object[elements.length + 1];
copyArrayElements(elements, 0, newElements, 0, elements.length);
newElements[newElements.length - 1] = element;
elements = newElements;
// výkonově by nemuselo být ideální
}
@Override
public void add(Object element, int index) {
}
@Override
public void remove(int index) {
if (index < 0 || index >= elements.length) {
throw new IndexOutOfBoundsException();
}
Object[] newElements = new Object[elements.length - 1];
copyArrayElements(elements, 0, newElements, 0, index);
copyArrayElements(elements, index + 1, newElements, index, elements.length - index - 1);
elements = newElements;
}
@Override
public Object get(int index) {
if (index < 0 || index >= elements.length) {
throw new IndexOutOfBoundsException();
}
return elements[index];
}
@Override
public int size() {
return elements.length;
}
private void copyArrayElements(Object[] src, int srcPos, Object[] dest, int destPos, int length) {
for (int i = 0; i < length; i++) {
dest[destPos + i] = src[srcPos + i];
}
} // System.arraycopy(src, srcPos, dest, destPos, length);
}
和 LinkedList 上的类似问题。
public class LinkedList implements List {
private Node first;
private int size; // aby se velikost nemusela vždy dopočítávat, tj. procházet celý seznam
@Override
public void add(Object element) {
if (first == null) {
first = new Node(element, null);
} else {
Node node = first;
while (node.next != null) {
node = node.next;
}
node.next = new Node(element, null);
}
size++;
}
@Override
public void add(Object element, int index) {
}
@Override
public void remove(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
if (index == 0) {
first = first.next;
} else {
Node node = first;
for (int i = 0; i < index - 1; i++) {
node = node.next;
}
node.next = node.next.next;
}
size--;
}
@Override
public Object get(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
Node node = first;
for (int i = 0; i < index; i++){
node = node.next;
}
return node.item;
}
@Override
public int size() {
return size;
}
private class Node {
private Object item;
private Node next;
Node(Object item, Node next) {
this.item = item;
this.next = next;
}
}
}
感谢您的帮助。
【问题讨论】:
-
对于 ArrayList,将添加点处和之后的所有元素移动一个,从末尾开始并返回添加点。然后在添加点插入元素。对于 LinkedList,在添加点断开链接,添加元素,然后在 index - 1、index 和 index + 1 处重新建立元素之间的链接。
标签: java arraylist linked-list