2016-08-06 2 views
0

В настоящее время я работаю над внедрением метода AddAtIndex и, по большей части, он работает нормально. Однако мой метод не передает мой тест JUnit, и я не могу понять, почему. Таким образом, я решил показать код я сделал до сих пор:Внедрение метода AddAtIndex в LinkedList

** 
    * Add an element to the list at the specified index 
    * @param The index where the element should be added 
    * @param element The element to add 
    */ 
    public void add(int index, E element) //Method should be O(1) time. 
    { 
     // TODO: Implement this method 
     if (index < 0) { 
      System.out.println("Can't add an element at a negative index."); 
     } 
     int i = 0; 
     LLNode<E> currentNode = head.next; 
     while (i < size) { 
      if (i == index) { 
       LLNode<E> newNode = new LLNode<E>(element); 
       LLNode<E> tempNode = new LLNode<E>(currentNode.data); 

       currentNode.next = tempNode; 
       currentNode.data = newNode.data; 

       newNode.prev = currentNode.prev; 
       newNode.next = tempNode; 
       tempNode.prev = newNode; 
       size++; 
      } 
      currentNode = currentNode.next; 
      i++; 
     } 

    } 

Мой мыслительный процесс позади кода является то, что метод создает новый узел, то он заменяет данные по указанному индексу связанного списка , Однако данные в узле, который он заменяет, хранятся во временном узле, который после нового узла увеличивается на следующий узел. Я около 80% уверен в моей реализации, хотя код выглядит немного неряшливо. Я создал драйвер для демонстрации реализации. Код драйвера заключается в следующем:

public class LinkedListDriver { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     MyLinkedList<String> nameList = new MyLinkedList<String>(); 
     nameList.add("Hamadi"); 
     nameList.add("Ballo"); 
     nameList.add(1, "Salisu"); 
     nameList.add(2, "Galo"); 
     System.out.println(nameList.toString()); 
     System.out.println(nameList.size()); 
     nameList.set(2, "Abdullahi"); 
     System.out.println(nameList.toString()); 
     nameList.remove(1); 
     System.out.println(nameList.toString()); 
     MyLinkedList<Integer> list1 = new MyLinkedList<Integer>(); 
     list1.add(65); 
     list1.add(21); 
     list1.add(42); 
     System.out.println(list1.toString()); 
     list1.remove(0); 
     System.out.println(list1.toString()); 
    } 

} 

Выход из драйвера следующим образом:

List: Hamadi, Salisu, Galo, Ballo, 
4 
Replacing Galo with Abdullahi 
List: Hamadi, Salisu, Abdullahi, Ballo, 
Removing Salisu from the list 
List: Hamadi, Abdullahi, Ballo, 
List: 65, 21, 42, 
Removing 65 from the list 
List: 21, 42, 
тест

устройства не однако со следующей ошибкой:

Он терпит неудачу в методе AssertEquals :

shortList.add(2, "E"); 
     shortList.add(3, "F"); 
     **assertEquals("AddAtIndex: at position 2 ", "E", shortList.get(2)); //fails here** 
     assertEquals("AddAtIndex: at position 3 ", "F", shortList.get(3)); 
     assertEquals("AddAtIndex: List size is ", 6, shortList.size()); 

Я хотел бы знать, что я делаю неправильно. У меня это буквально полностью выяснено, хотя я знаю, что кое-что немного о моем методе AddAtindex. Благодаря!

+2

использовать отладчик и посмотреть, как указатели движутся –

+0

Из начального выхода, я бы сказал, что метод добавить в основном работает. Я не уверен, что вы делаете метод, чтобы вернуть вам плохую ценность, но –

+0

Вы также должны узнать о 'for'-loops:' for (int i = 0; i

ответ

2

Вам это не нужно tempNode. Просто создайте newNode и вставьте его правильно между currentNode и его предыдущим узлом.

Вы также должны рассмотреть возможность добавления элемента в начале (без предыдущего) или конца (без следующего) списка.

+0

это элемент в начале, это пустой дозорный узел, известный как голова. Я должен был быть более конкретным, спасибо! – Linuxn00b

0

Я использовал голову и хвост как узлы дозорного. Создал новый узел, который будет добавлен в список.

public boolean add(E element) { 
     // create new element 
     LLNode<E> variable = new LLNode(element); 
     variable.next = null; 
     variable.prev = null; 

     // if element is null, throw exception 
     if (element == null) { 
      // return false; 
      throw new NullPointerException("Element is null"); 
     } else { 
      // get the value stored in tail.prev in variable temp. 
      variable.prev = tail.prev; 
      variable.next = tail; 
      // now modify the tail node prev and new node next 
      tail.prev = variable; 

      // get prev node next link changed 
      variable.prev.next = variable; 

      // update size 
      if (head.next.next != tail) { 
       size++; 
      } 
      return true; 
     } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^