2017-01-15 14 views
1

Мы начали со связанного списка и узлов в классе, и я думаю, что я понял, как они работают. Но с одной стороны, когда мы должны добавить узел в связанный список, у меня возникают некоторые проблемы, чтобы заставить его работать. Ошибка возникает в методе «добавить». Моя IDE не говорит мне о проблеме.Попытка добавления узлов в связанный список

Мой класс LinkedList:

public class LinkedList { 
    public Node head = null; 

    public void insert(Node n) { 
     n.next = head; 
     head = n; 
    } 

    public Node search(int nummer) { 
     Node current = head; 

     while (current != null) { 
      if (current.element == nummer) 
       return current; 
      current = current.next; 
     } 
     return null; 
    } 

    public int count() { 
     int c = 0; 

     for (Node n = head; n != null; n = n.next) { 
      c++; 
     } 
     return c; 
    } 

    public void append(Node n) { 
     if (head == null){ 
      head = new Node(n, null); 
     } 
     else { 
      Node p = head; 
      while (p.a != null){ 
       p = (Node) p.a; 
      } 
     p.a = new Node(n, null);} 
    }  
} 

Мой узел класса:

public class Node { 
    public int element = 0; 
    public Node next = null; 
    Object a; 

    public Node(int e, Node n) { 
    this.element = e; 
    this.next = n; 
    } 

    public Node(int e) { 
    this.element = e; 
    } 

} 
+0

Какие проблемы вы с? Что происходит, когда вы запускаете свой код? Как результат отличается от того, что вы хотите? На этом этапе вашей карьеры программирования очень важно научиться отлаживать собственный код. Вы должны использовать отладчик или добавить инструкции 'System.out.println()', чтобы помочь вам понять, что делает ваш код. Я также предлагаю вам рисовать изображения, чтобы визуализировать то, что вы делаете. Используйте поле или круг для представления узла и стрелок для представления «следующей» ссылки между узлами. –

ответ

0

Вы обрабатываете поле a, как будто это указатель на следующий узел в списке. Это не так, это фактически данные , содержащиеся в каждом узле списка. Вместо этого необходимо изменить свой метод append() использовать next:

public void append(Node n) { 
    if (head == null) { 
     head = new Node(n, null); 
    } 
    else { 
     Node p = head; 
     // walk down the list from the head until reaching the end 
     while (p.next != null) { 
      p = (Node) p.next; 
     } 
     // then append the new Node to the end of the list 
     p.next = n; 
    } 
} 

Обратите внимание, что в идеале вы должны иметь методы получения и установки для вашего Node класса. Я мог бы предложить что-то вроде этого:

public class Node { 
    private int element = 0; // no idea what this is for 
    private Node next = null; 
    private Object a; 

    public Node(int e, Node n) { 
     this.element = e; 
     this.next = n; 
    } 

    public Node(int e) { 
     this.element = e; 
    } 

    public void setNext(Node next) { 
     this.next = next; 
    } 

    public Node getNext() { 
     return next; 
    } 

    public void setA(Object a) { 
     this.a = a; 
    } 

    public Object getA() { 
     return a; 
    } 
} 

Используя этот обновленный Definiton из Node вашего метода append() станет:

public void append(Node n) { 
    if (head == null) { 
     head = new Node(n, null); 
    } 
    else { 
     Node p = head; 
     // walk down the list from the head until reaching the end 
     while (p.getNext() != null) { 
      p = p.getNext(); 
     } 
     // then append the new Node to the end of the list 
     p.setNext(n); 
    } 
} 
+0

Благодарим вас за обновленную версию, но проблема все еще происходит. n в «новом Node (n, null)» теперь говорит, что «Node не может быть преобразован в int». –

+0

Это все код, который существует, и я искал ошибку столько раз. –

+0

Обнаружил ошибку, извините. .setNext (n) 'и непосредственно добавить новый' Node'. –