您应该在Node 类中添加一个属性,以了解当前节点数组的当前索引。我还会在您的DynamicArrayOfInts 中添加一个属性以保留当前节点的引用。
然后在你的 add 方法中,检查当前节点的数组是否未满(这很容易做到,因为你知道索引的值和每个节点的元素数)。
如果不是这种情况(或者如果第一次 add 调用的 head 为 null),则创建一个新节点并将元素添加到其数组中,否则只需为当前节点填充数组的下一个槽。
这就是我将如何实现它。
class DynamicArrayOfInts {
private Node head, current;
private int numOfElementsPerNode;
public DynamicArrayOfInts(int elementsPerNode) {
if(elementsPerNode <= 0)
throw new IllegalArgumentException("elementsPerNode must be > 0");
numOfElementsPerNode = elementsPerNode;
}
public void add(int e) {
if(head == null){
head = new Node(numOfElementsPerNode, null);
head.data[head.index++] = e;
current = head;
return;
}
if(current.index == numOfElementsPerNode){
Node n = new Node(numOfElementsPerNode, null);
current.next = n;
current = n;
}
current.data[current.index++] = e;
}
@Override
public String toString(){
StringBuilder sb = new StringBuilder();
Node n = head;
while(n != null){
sb.append(Arrays.toString(n.data));
n = n.next;
}
return sb.toString();
}
private static class Node {
private int[] data;
private int index;
private Node next;
public Node(int n, Node nxt) {
data = new int[n];
index = 0;
next = nxt;
}
}
}
一个小 main 来展示它的行为方式:
public static void main(String[] args){
int[] toAdd = {5,7,10,-1};
DynamicArrayOfInts d = new DynamicArrayOfInts(2);
for(int i : toAdd){
d.add(i);
System.out.println(d);
}
}
输出:
[5, 0]
[5, 7]
[5, 7][10, 0]
[5, 7][10, -1]