我想在 Java 中添加一个方法add(int index, E element)
,该方法在列表中的指定索引处插入指定元素,并将当前处于该位置的元素(如果有(和任何后续元素向右移动(将一个添加到它们的索引中(。但是我想 for 循环中代码中的索引有问题。有什么想法如何解决吗?
public class SingleLinkedList<E> implements ISingleLinkedList<E> {
Node head;
int size = 0;
@Override
public void add(int index, E element) throws IndexOutOfBoundsException {
Node newNode = new Node(element);
if(head == null && index == 0) {
head = newNode;
}
else if (index == 0 && head != null) {
Node tempNode = new Node(element);
tempNode.setmNextNode(head);
head = tempNode;
}
else {
Node tempNode = head;
for(int i = 1; i<index; i++) {
tempNode = tempNode.getmNextNode();
}
/**Node newNode = new Node(element);**/
newNode.setmNextNode(tempNode);
tempNode.setmNextNode(newNode);
}
size++;
}
}
我的 Node 类代码是:
public class Node<E> {
private E mElement;
private Node<E> mNextNode;
Node(E data) {
this.setmElement(data);
}
public E getmElement() {
return this.mElement;
}
public void setmElement(E element) {
this.mElement = element;
}
public Node<E> getmNextNode()
{
return this.mNextNode;
}
public void setmNextNode(Node<E> node)
{
this.mNextNode = node;
}
问题是我有一个 JUnit 测试在添加此方法时失败,我不知道还需要添加什么才能通过测试。
@Test
public void testAddWithIndexesToListWith5Elements() {
int listSize = 5;
// First create an ArrayList with string elements that constitutes the test data
ArrayList<Object> arrayOfTestData = generateArrayOfTestData(listSize);
// Then create a single linked list consisting of the elements of the ArrayList
ISingleLinkedList<Object> sll = createSingleLinkedListOfTestData(arrayOfTestData);
// Add new elements first, in the middle and last to the ArrayList of test data
// and the single linked list
try {
arrayOfTestData.add(0, 42);
arrayOfTestData.add(3, "addedElement1");
arrayOfTestData.add(7, "addedElement2");
sll.add(0, 42);
sll.add(3, "addedElement1");
sll.add(7, "addedElement2");
}
catch (Exception e) {
fail("testAddWithIndexesToListWith5Elements - add() method failed");
}
// Check that the contents are equal
for (int i = 0; i < sll.size(); i++) {
assertEquals(arrayOfTestData.get(i), sll.get(i));
}
}
newNode.setmNextNode(tempNode);
tempNode.setmNextNode(newNode);
这只会创造一个循环。看起来您的newNode
应该指向tempNode.getmNextNode()
或类似的内容。
你的问题很不清楚,但我想我可以看到一个问题。
如果未0
index
,则将遍历节点,直到达到索引。
如果列表中没有足够的元素,您将在要插入元素的索引之前到达列表的末尾。
在这种情况下,
tempNode = tempNode.getmNextNode();
将tempNode
设置为null
。
在下一次迭代中,此行将抛出一个NullPointerException
。
您可以通过测试tempNode.getmNextNode();
是否null
来绕过此问题。
如果是这种情况,元素将只插入到末尾/该点,或者不会插入。