Изменение связанного списка с помощью стека?

#java

Вопрос:

Это код, который изменяет связанный список с помощью стека. Я все понял правильно, создав связанный список и получив ввод от пользователя, но я ошибся в какой-то логике. Я пытаюсь перевернуть связанный список, используя стек, но это только перевернет два числа, если, допустим, я дам три числа. Как мне все сделать правильно?

импорт java.util.*;

 class LinkedList{
    Node head;
    
    static class Node{`
        int data;
        Node next;
        Node(int d){
            this.data = d;
            next = null;
        }
    }
    
    public static LinkedList insert(LinkedList list, int data){
        Node new_node = new Node(data);
        if(list.head == null){
            list.head = new_node;
        }
        else{
            Node last = list.head;
            while(last.next != null){
                last = last.next;
            }
            last.next = new_node;
        }
        
        return list;
    }
    
    public static LinkedList reverse(LinkedList list){
        Stack<Integer> stack = new Stack<Integer>();
        Node current = list.head;
        while(current.next != null){
            stack.push(current.data);
            current = current.next;
        }
        while(!stack.isEmpty()){
            System.out.println("The reversed list is: "   stack.pop());
        }
        return list;
    }
}

public class Main
{
    public static void main(String[] args) {
        LinkedList l = new LinkedList();
        Scanner sc = new Scanner(System.in);
        int length = sc.nextInt();
        for(int i=1; i<=length; i  ){
            int number = sc.nextInt();
            l.insert(l,number);
        }
        l.reverse(l);
    }
}
 

Комментарии:

1. изменить current.next на current

2. Да! это сработало.

3. Рад помочь…

Ответ №1:

Проблема заключается в вашей обратной функции. При чтении связанного списка ваша логика цикла while пропускает последний элемент.

Правильная функция-это:

 public static LinkedList reverse(LinkedList list){
    Stack<Integer> stack = new Stack<Integer>();
    Node current = list.head;
    while(current != null){  // instead of while(current.next != null)
        System.out.println("Pushed Data:" current.data);
        stack.push(current.data);
        current = current.next;
    }
   System.out.println("The reversed list is: ");
    while(!stack.isEmpty()){
        
        System.out.println(stack.pop());
    }
    return list;
}
 

Ответ №2:

Все выглядит хорошо, кроме строки while(current.next != null){ , так как здесь вы проверяете наличие следующего узла вместо текущего узла. Поэтому вам нужно изменить эту строку на while(current != null){