Добавить метод java - PullRequest
       37

Добавить метод java

0 голосов
/ 09 февраля 2020

Я хочу добавить метод add(int index, E element) в Java, который вставляет указанный элемент по указанному индексу в списке и смещает элемент, находящийся в данный момент в этой позиции (если есть), и любые последующие элементы вправо (добавляет один к своим показателям). Но я думаю, что-то не так с индексами в моем коде в for-l oop. Любые идеи, как это решить?

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));
    }
}

Ответы [ 3 ]

2 голосов
/ 09 февраля 2020
    newNode.setmNextNode(tempNode);
    tempNode.setmNextNode(newNode);

Это просто собирается создать цикл. Похоже, ваш newNode должен указывать на tempNode.getmNextNode() или что-то в этом роде.

1 голос
/ 09 февраля 2020

Заменить

newNode.setmNextNode(tempNode);
tempNode.setmNextNode(newNode);

на

newNode.setmNextNode(tempNode.getmNextNode());
tempNode.setmNextNode(newNode);

enter image description here

1 голос
/ 09 февраля 2020

Ваш вопрос довольно неясен, но я думаю, что вижу проблему.

Если index не 0, вы будете перебирать узлы, пока не будет достигнут индекс.

Если в списке недостаточно элементов, вы достигнете конца списка перед индексом, в который хотите вставить элемент.

В этом случае

tempNode = tempNode.getmNextNode();

установит tempNode в null.

. На следующей итерации эта строка выдаст NullPointerException.

Эту проблему можно обойти, протестировав, если tempNode.getmNextNode(); равно null.

В этом случае элемент будет вставлен только в конце / этой точке или не будет вставлен.

...