所以我的问题的概念是:假设我们有节点。每个节点都有一个整数数组。现在,我们必须在数组的末尾添加一个整数。我们怎么做?
这是我到目前为止所做的:
创建的类Node:
public class Node {
private int[] data;
Node next;
public Node(int n, Node nxt) {
data = new int[n];
next = nxt;
}
}
然后是动态数组列表类:
public class DynamicArrayOfInts {
private Node head = null;
private int numOfElementsPerNode = 0;
public DynamicArrayOfInts(int elementsPerNode) {
numOfElementsPerNode = elementsPerNode;
}
public void add(int e) {
}
}
答案 0 :(得分:0)
您应该在Node
类中添加一个属性,以了解当前Node的数组的当前索引。我还会在DynamicArrayOfInts
中添加一个属性,以保留当前节点的引用。
然后在你的add方法中,检查当前节点所拥有的数组是否未满(可以轻松完成,因为你知道索引的值和每个节点的元素数)。
如果不是这种情况(或者如果第一次添加调用的头部为空),则创建一个新节点并在其数组中添加该元素,否则只需填充当前节点的数组的下一个插槽。
这就是我实现它的方式。
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;
}
}
}
显示其行为的小主要内容:
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]
答案 1 :(得分:0)
不幸的是,在这种情况下你必须创建一个新的数组(是的,我感到很痛苦),它将比data
多一个元素。您必须将data
的内容复制到新数组中,并将最后一个元素设置为int
值。这不是太优雅,这就是Mureinik建议您使用ArrayList
Node
(ArrayList<Node>
)的原因。我甚至可以增强他的建议,使你的解决方案更加通用,并告诉你使用AbstractList<Node>
代替并用ArrayList
实例化它,但这可能比你当前的水平太高级了(没有冒犯,我们一切都在那里)。至于你的确切问题,我想象你的Node类中有如下方法来处理这个问题。
public void push(int newValue) {
int[] newData = new int[data.length + 1];
for (int i = 0; i < data.length; i++) {
newData[i] = data[i];
}
newData[data.length] = newValue;
data = newData;
}