#java #linked-list
#java #связанный список
Вопрос:
Я реализовал решение для обращения связанного списка в java, которое я нашел в Интернете. Но по какой-то причине это не работает в моем коде.
Когда я печатаю список, он печатает только первый узел. Я знаю, что метод print работает, потому что он печатает все целиком, когда я не пытаюсь изменить.
Где я ошибся в этом коде?
public class LinkedLists {
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.addLast(10);
list.addLast(20);
list.addLast(30);
list.reverseList();
list.print();
}
public static class LinkedList{
private class Node{
private int value;
private Node next;
}
public Node first;
public Node last;
public void addLast(int item){
Node node = new Node();
node.value = item;
if(first == null) {
first = node;
last = node;
} else {
last.next = node;
last = node;
}
}
private Node reverse(Node head, Node newHead) {
//base case: when first = last you return
if(head == null) {
return newHead;
}
Node temp = head.next;
head.next = newHead; //this will initially be null
newHead = head;
head = temp;
return reverse(head, newHead);
}
public Node reverseList() {
return reverse(first, null);
}
public void print(){
Node current = first;
while (current != null){
System.out.print(current.value " ");
current = current.next;
}
}
} //class ends
}
Комментарии:
1. Ваш обратный алгоритм никогда не затрагивает важные элементы
first
иlast
, но вашfirst
(который был первым и, предположительно, теперь является последним).2. сначала передается в reverse через reverseList
3. В качестве значения, да. Но это не значит, что
first
last
они обновляются. Естественно, если вы изменили список, их нужно будет поменять местами. Причина, по которой вы видите только одно напечатанное значение, заключается в том, чтоfirst
оно указывает на последнюю запись после разворота.
Ответ №1:
Хотя reverse
возвращает правильную ссылку для нового заголовка, начальный вызов reverseList
— в основной программе — игнорирует эту возвращенную ссылку.
Ваш reverseList
метод должен лучше ничего не возвращать, а вместо этого обновлять элементы first
and last
:
public void reverseList() {
last = first;
first = reverse(first, null);
}