2015-09-16 2 views
1

Итак, я прочитал несколько сообщений по этому вопросу, но все они ссылаются на итерацию через связанный список, который уже реализован Java; например, LinkedList<String> list = new LinkedList<String>();. И затем далее следует использовать цикл for для итерации по связанному списку. Тем не менее, я пытаюсь реализовать свой собственный связанный список, и я не уверен, как проходить через них. Другими словами, у меня есть следующий код:Итерация через реализацию связанного списка Java

class Node { 
    private Node next = null; 
    private int data; 

    public Node(int d) { 
     data = d; 
    } 

    void appendToTail(int d) { 
     Node end = new Node(d); 
     Node n = this; 
     while(n.next != null) { 
      n = n.next; 
     } 
     n.next = end; 
    } 

    void print() { 
     Node n = this; 
     while(n.next != null) { 
      System.out.println(n); 
      n = n.next; 
     } 
    } 

    public static void main(String [] args) { 
     Node x = new Node(4); 
     x.appendToTail(5); 
     x.print(); 
    } 
} 

print() функция, которую я написал, мои усилия в попытке перебрать связанного списка. Но это не работает. Кто-нибудь знает, как проходить через связанный список, учитывая собственную реализацию связанного списка?

+0

Elaborate _But, не working_ –

ответ

4

Изменить

while(n.next != null) 

в

while(n != null) 

, потому что внутри цикла вы печатаете текущий узелn, а затем указывать его в следующий узел по: n = n.next;

+0

Спасибо! Я просто должен также убедиться, что я делаю 'System.out.println (n.data)'. –

+0

Да, вы должны напечатать 'node.data', и вы можете. –

0

Вы должны проверить, является ли текущий кивок e - null или нет, а не следующий узел. Поскольку вы пропустите последний узел списка таким образом, next будет null для последнего узла, и цикл не будет выполнен.

Вам необходимо напечатать data часть узла. Вы не определили метод toString для вашего класса Node.

void print() { 
    Node n = this; 
    while(n != null) { 
    System.out.println(n.data); 
    n = n.next; 
    } 
} 

Вы можете определить toString как ниже для вашего Node класса, то вы можете сразу распечатать Node объект в System.out заявлении.

@Override 
public String toString() { 
    return "Node{" + 
     ", data=" + data + 
     '}'; 
} 
0

Вы должны проверять n для нуля, не n.next() ::

while(n != null) 

, но у вас есть все аспекты for цикла (начального состояния, условие завершения и итерация выражение), так что это может лучше быть выражена как for цикла:

for (Node n = this; n != null; n = n.next) 
    System.out.println(n.data); 
Смежные вопросы